Workshop/StartHaskell2/exercise14

『もうちょっとだけモナド』 練習問題

Writerモナドを使ってみよう

逆ポーランド記法で書かれた式を計算する関数 solveRPN (p.214) に、Writerモナドを使って計算経過ログをとる機能を追加してみよう。


差分リスト

誰かよろしくお願いします


モナドとしての関数

関数のモナドの定義を見ながら、無理やり使える例を探してみよう。

たとえば、リストの前半分だけ取る関数 takeHalf は、こんな風に書ける。(あまり書こうとは思わないけど)


Readerモナドを使ってみよう

いまUnixの環境変数を、変数名と値の連想リストで表すことにする。

Control.Monad.Readerで定義されている Reader モナドでは、 ask 関数を使って、環境を参照することができる。

環境変数から指定された変数名の値を探してくる関数 lookupEnv を実装しよう。ただし、変数名が見つからない場合は、空文字を返す。

また、$HOME が設定されていればその値を返し、なければ “/etc” を返す関数 getConfPath を書いてみよう。


Stateモナドを使ってみよう

2次元平面上を移動する処理を書いてみよう。(上下左右の座標実装はお任せ)


スタックを拡張しよう

(p.333) で出てきたスタックに、以下の操作を追加しよう。

  • undo : 直前の操作を取り消し、状態を元に戻す
  • clear : スタックを空にする。ただし操作履歴の情報は残る(undoできるようにしておく)

実行例


Eitherモナド

(p.342 NOTE) ピエールのバランス棒に鳥がとまる様子をシミュレートしました。ピエールが滑って落ちた瞬間に棒の左右に何羽の鳥が止まってるか分かるように、Eitherモナドを使って書き直してみよう。


Prob(確率)モナド

(p.361) 結果が一致する事象の確率をまとめる関数 joinSameOutcomes を書いてみよう。