haskell-jp / beginners #19 at 2022-01-17 23:18:30 +0900

ニコラスと申します。(だいぶ前にもくもく会に参加させていただきました。)
質問させていただきたいです。

グラフを描画したいのですが, stackを使っている時にはどのようにすればいいかお教えいただければ幸いに存じます。。(stack exec project-exeをした後にグラフの描画が出てくるようにしたいです。)
ネットをみたところ、gnuplot?を用いて描画しているのが主だったのですが、stackからどのようにgnuplotを使うか分からなくなってしまいました。
具体的には
https://yakituka.hateblo.jp/entry/2019/08/26/193907
のサイトにあるように、微分方程式を描画したいです。
Glossでできないかと調べたのですが、このようなグラフを描画をする時にGlossをどう使えばいいかわかりませんでした。
よろしくお願い申し上げます:woman-bowing:
こちらのサイトを読んでみましたがら最後に
Main.hsを実行して、これによって得られたresult.datをgnuplotで適当に表示します。
と書かれていますので、Haskellで直接gnuplotを呼び出しているわけではなく、単にHaskellで計算結果をgnuplotが読めるファイルとして書き出しているだけかと思います。
ご返信ありがとうございます!
stack exec project-exeと書くと、ファイルが生成されて、それを後からgnuplotすることで描画しているのですね。。失礼いたしました。
実は、僕の環境でこれを書いてみてもうまくいかなかったので、混乱してしまっています。簡単な例として、例えば、y = sin xのグラフを描画したい時にはstackのMain.hsには何を書けば良いのでしょうか。。
(なんとなく下に添付させていただいたスクショのようになるかと思ったのですが、writeFileの後には何を書けばいいのでしょうか。Main.hsを完成させた後に, gnuplotなどの操作をするのだとすれば、ghciで操作しなければならないのでしょうか。)

いくつか質問させていただいて恐縮です。よろしくお願い申し上げます。
(初心者なので、根本的な間違いがあるかもしれません。何卒、ご容赦ください:woman-bowing:)
gnuplotがどういう形式のファイルを受け付けるようになっているか詳細が分からないので確信はないのですが、例えば挙げていただいた記事の例を見る限り
appendFile filePath (show x ++ "\n")

と、 appendFile 関数を使って、1行毎に`Coordinate`型の値を`show`した結果を書き込んでいるようです。
で、「`Coordinate`型の値を`show`した結果」というのは、
instance Show Coordinate where
    show (Crd t x y z) =  map show |> foldl1 (\s0 s1 -> s0 ++ "," ++ s1) $ [t, x, y, z]

とあるとおり、恐らく 1.0,2.1,3,2,4.3 のような、数値をカンマ区切りにした文字列のようです。

ご質問の、 y = sin xは2次元のグラフでしょうから、2つの数値をカンマ区切りで1行ずつ書き込めばいいんじゃないかと思います。
詳細はHaskellの話を超えるので、gnuplotの使い方を調べてください。
ご返信ありがとうございます!
gnuplotに渡すファイルを作るところまでがHaskellの話で、そこからはまた違う話になってしまうのですね。gnuplotとHaskellをくっつけて考えてしまってばかりいました。

今、サイトの描画が無事にできました:woman-bowing:
sinの描画もトライしてみます。

教えて頂き、なんとなく理解できたような気がします。ありがとうございました!
gnuplotをHaskellから呼び出して各gnuplotコマンドを標準入力に渡してやることでHaskellのプログラムからgnuplotを利用した描画ができることを追記させていただきます。
C言語から制御する記事が多く見つかるかと思います。
すみません、返信遅れました。申し訳ないです。

そうなのですね !引き続き調べてみます。貴重な情報をありがとうござます!:woman-bowing: