wvogel日記

自分用の技術備忘録が多めです.

wxHaskellテキスト処理

最近滞ってしまっていた....
今、大学の実験課題をHaskellでやっていいよと言われたので、カリカリ作業しているところです。
ネットワークシミュレーション、ダイクストラ、そして現在制作中の統計処理と、3つの課題のうちダイクストラ以外はHaskellでやってます。

すごいHaskell楽しく学ぼう他、記事を読んでいるうちに、ダイクストラHaskellで出来たなあ、と後悔する最近。
夏休みに時間あったら書いてみよう。


さてさて。
今回は、課題の性質上統計処理を施す部分は副作用なく記述できるのですが、グラフ描画やファイルの入出力に関してはIOが必要です。
課題をこなすだけなら簡単に済ませてしまいたいところですが、
これはHaskellを広めるチャンスでもあるわけですよ!
そこで、Haskellが弱いとされているIO処理、GUI部に関しても簡単に出来ちゃうよアピールをするために、wxHaskellを用いてGUIを製作しています。

上のようなツールを作ってみた。(Fedora上)
テキストボックスとボタンで構成されているだけですが。

では、事象数を取り出してみましょう。
WxHaskell/Tips and tricks - HaskellWiki
ここに書かれているとおりに、get [name of textentry] text
と書けば文字列を取り出せます。

test f txtbox = do
    n <- get txtbox text
    infoDialog f "事象数" n

このような関数を上のGUIのボタンに試験的に適用して実行すると、

となり、見事取得出来ています!!


あとはこれを使って正規分布などを計算、描画していくだけです。
ここで、wxHaskell上に描画・Glossを用いて描画など考えたのですが、煩雑です。
第一、値の最大最小、定義域なんかを色々考えないといけない。

なので、ここは諦めてgnuplot使うか....
と思っていたら!gnuplotを呼ぶライブラリがあると聞きました!
早速調べるとすぐにヒット
haskellでのgnuplot
ここにあるとおりにcabalで導入、早速ghci上で実験してみました。

> :m Graphics.Gnuplot.Simple
> let vs = [1.0..1000]
> let xs = map (\v -> cos v * cos (2*v)) vs
> let ys = map (\v -> sin v * cos (3*v)) vs
> plotDots
     [PNG "test.png" , Title "fromHaskell" , YRange (-5.0 , 5.0)]
         $ zip xs ys

これを実行すると、test.pngファイルが生成され、以下の図形が!


以上、wxHaskellでのテキスト処理とgnuplotの利用方法でした