Prev: モナド則 TOC: 目次 Next: Haskell におけるモナドのサポート

練習問題

  1. do 記法
  2. モナド値の合成
  3. List モナドを使う
  4. モナドクラス制約を使う

このセクションでは、読者の皆さんのモナドを使った推論の技術を磨き、 モナドプログラミングの深遠を覗きみるまえに、Maybe と List モナドの 使い方と機能を確実に理解してもらうために、いくつかの単純な練習問題 を用意しました。練習問題は直前にあつかった、クローン羊の 例題 で、もう慣れしたしんだ ことと思います。

練習問題 1: do 記法

Example 2中の関数 maternalGrandfatherfathersMaternalGrandmother および mothersPaternalGrandfather をモナド演算子 return および >>= を使い、 do 記法の構文糖衣を用いずに、書換えなさい。

解答は ここ

練習問題 2: モナド値の合成

Sheep -> Maybe Sheep という型シグネチャを もつ関数 parent および grandparent を書きなさい。 これらの関数は、説明にマッチする全羊のなかから一頭選んで返すか、 または、該当する羊がいないときには Nothing を返さなければ なりません。ヒント: mplus がここでは役に立ちます。

解答は ここ

練習問題 3: List モナドを使う

Sheep -> [Sheep] という型シグネチャをもつ関数 parent および grandparent を書きなさい。 これらの関数は、説明にマッチするすべての羊を返すか、 または、該当する羊がいないときには空リストを返さなければなりません。 ヒント: リストに対する mplus 演算子がここでは役に立ちます。 また、Maybe モジュールの maybeToList 関数が Maybe モナドの値からリストモナドに変換するのに使えます。

解答は ここ

練習問題 4: モナドクラスの制約を使う

モナドはモジュラリティを増進し、頻繁に使う計算戦略を他の多くの計算を 構築するのに使える単一のブロックにカプセル化により再利用することを促進 する。それほど自明なことではありませんが、モナドを変更することで、 そこで行われる計算が別の計算のバリエーションを得られるということ を可能にすることによっても、モジュラリティを増進します。 このことはモナドの型構築子中で多相性をもつ関数を、 (Monad m) =>(MonadPlus m) => などのクラス制約をもちいて 書くことによって達成できます。

(MonadPlus m) => Sheep -> m Sheep という型シグネチャを持つ関数 parent および grandparent を書きなさい。それらの関数は、Maybe および List モナドの両方で使えなくてはなりません。それらの関数の振舞いは、List モナドで使ったときと、Maybe モナドで使ったときではどのように違いますか。 Haskell における型クラスとクラス制約の使い方の復習が必要であれば、 ここ を見なさい。

解答はここ


Prev: モナド則 TOC: 目次 Next: Haskell におけるモナドのサポート