Hatena::Grouphaskell

knenetのhaskell手記

2007-10-02

副作用の分離 08:37 はてなブックマーク - 副作用の分離 - knenetのhaskell手記

当たり前かも知れないけど、リアルタイムに入力を得て結果を返す関数は、入力を得る部分と、計算する部分は分離するべきである。

そうでないと、計算する部分に任意の値を与えてテストをすることがしにくくなる。

さらに、表示する部分も分けられた方が良い。テスト用には、実際の動作より、数値のリストなどの方が分かりやすいかも知れない。

このように分離をするためには、別に変数を使う必要はない。

それぞれの関数を別々に作り、呼び出し側で、それらをパイプした関数を作ればいいのだ。

それがMonadでありArrowである(と思う)。


インタラクティブなループするプログラムを作るには、

  • 入力を受ける
  • 前回のデータを引き継ぐ
  • 新しいデータを用いて表示系を書き直す

必要がある。

入力があるまで動かないイベントドリブンと、入力がないことも入力の一つとみなすタイムドリブンがある。

どちらにせよ、入力が決まったら次の動作に移行できる。

それさえ出来れば、現在の必要なデータを全て引数にして、次の動作へ写す関数を考えれば良い。

MonadでやるのとArrowでやるのとどちらの方が上手く書けるだろうか……。