Prev: モナド則 | TOC: 目次 | Next: Haskell におけるモナドのサポート |
このセクションでは、読者の皆さんのモナドを使った推論の技術を磨き、 モナドプログラミングの深遠を覗きみるまえに、Maybe と List モナドの 使い方と機能を確実に理解してもらうために、いくつかの単純な練習問題 を用意しました。練習問題は直前にあつかった、クローン羊の 例題 で、もう慣れしたしんだ ことと思います。
Example 2中の関数
maternalGrandfather
、
fathersMaternalGrandmother
および mothersPaternalGrandfather
をモナド演算子
return
および >>=
を使い、
do 記法の構文糖衣を用いずに、書換えなさい。
解答は ここ。
Sheep -> Maybe Sheep
という型シグネチャを
もつ関数 parent
および grandparent
を書きなさい。
これらの関数は、説明にマッチする全羊のなかから一頭選んで返すか、
または、該当する羊がいないときには Nothing
を返さなければ
なりません。ヒント: mplus
がここでは役に立ちます。
解答は ここ。
Sheep -> [Sheep]
という型シグネチャをもつ関数
parent
および grandparent
を書きなさい。
これらの関数は、説明にマッチするすべての羊を返すか、
または、該当する羊がいないときには空リストを返さなければなりません。
ヒント: リストに対する mplus
演算子がここでは役に立ちます。
また、Maybe
モジュールの maybeToList
関数が
Maybe モナドの値からリストモナドに変換するのに使えます。
解答は ここ。
モナドはモジュラリティを増進し、頻繁に使う計算戦略を他の多くの計算を
構築するのに使える単一のブロックにカプセル化により再利用することを促進
する。それほど自明なことではありませんが、モナドを変更することで、
そこで行われる計算が別の計算のバリエーションを得られるということ
を可能にすることによっても、モジュラリティを増進します。
このことはモナドの型構築子中で多相性をもつ関数を、
(Monad m) =>
、
(MonadPlus m) =>
などのクラス制約をもちいて
書くことによって達成できます。
(MonadPlus m) => Sheep -> m Sheep
という型シグネチャを持つ関数 parent
および
grandparent
を書きなさい。それらの関数は、Maybe および List
モナドの両方で使えなくてはなりません。それらの関数の振舞いは、List
モナドで使ったときと、Maybe モナドで使ったときではどのように違いますか。
Haskell における型クラスとクラス制約の使い方の復習が必要であれば、
ここ
を見なさい。
解答はここ。
Prev: モナド則 | TOC: 目次 | Next: Haskell におけるモナドのサポート |