みどりねこ日記

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

Haskellモナドトランスフォーマー(9)

標準ライブラリの中でも、とりわけ使いやすい関数の一つに、liftMがあります。モナディックでない関数をモナドの関数に持ち上げます。型を見てみましょう。

liftM :: Monad m => (a1 -> r) -> m a1 -> m r

さて、liftMは関数(a1 -> r)と、a1を保持したモナドをとり、受け取った関数をa1に適用し、mに包んで結果を返します。この関数を理解するには、どのように使われるかを見るのが一番です。以下のコードはすべて同じ意味を持ちます。

do記法
do
	foo <- someMonadicThing
	return (myFn foo)
liftM
liftM myFn someMonadicThing
liftM(演算子として)
myFn `liftM` someMonadicThing

3つ目の例は目からうろこなのでは。liftMは($)のモナドバージョンとして使われています。

モナディックでないもの
myFn $ aNonMonadicThing
モナド
myFn `liftM` someMonadicThing