みどりねこ日記

よくわからないけど、頑張りますよ。

Haskellのモナド(3)

モナドは以下の3つがあるものとして定義されています。

  • アクションの型をその結果の型から生成する方法。型コンストラクタMとされる場合が多い。
  • 値を生成するだけのアクションを生成する方法。returnと呼ばれることが多い。
return :: a -> M a

型情報から、returnは a から "結果の型" aを生成するものと読めます。アクションはreturnのパラメータ通りの値を返す必要があり、その他のことはしてはいけないことになっています。

  • アクションを連続させる方法。前のアクションの結果を次のアクションに渡すことを許しています。多くの場合、>>=演算子と表され、バインドと呼ばれます。
(>>=) :: M a -> (a -> M b) -> M b

型情報から、この演算子が型がM aである値返すアクションと、aからM bに変える関数を受け取り、結果M bを返すものだということがわかります。なんとなくですが、この演算子の結果は最初のアクションがふたつ目の関数に影響されたものだ、と見えると思います。

また、後述するモナド則と呼ばれる3つの則を満たす必要があります。しかし今はreturnと>>=演算子の意味の説明はこのモナド則を満たさない限り正確であるは言えないんだ、ということを知っていれば十分かと思います。

例外を処理する単純なモナドであるMaybeモナドを使って、例を挙げます。
型コンストラクタMはここではMaybeですので、

return :: a -> Maybe a
(>>=) :: Maybe a -> (a -> Maybe b) -> Maybe b

という型になります。
以下のように実装できます。

return x = Just x
(>>=) m g = case m of
	Nothing -> Nothing
	Just x -> g x

次回は、これらがどうして、そしてどのように役立つのかを説明していきます。