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