読者です 読者をやめる 読者になる 読者になる

IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

モナドが消える

99 questions の6問目の別解が難しい。

Prelude> Control.Monad.liftM2 (==) id reverse [1,2,3,2,1]
True
Prelude> Control.Monad.liftM2 (==) id reverse [1,2,3,2,4]
False
Prelude> 

となっています。

次のように型を確認すると、

(1)
Prelude> :t Control.Monad.liftM2
Control.Monad.liftM2
  :: Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r

(2)
Prelude> :t Control.Monad.liftM2 (==)
Control.Monad.liftM2 (==)
  :: (Eq a2, Monad m) => m a2 -> m a2 -> m Bool

(3)
Prelude> :t Control.Monad.liftM2 (==) id  
Control.Monad.liftM2 (==) id :: Eq a => (a -> a) -> a -> Bool

(4)
Prelude> :t Control.Monad.liftM2 (==) id reverse 
Control.Monad.liftM2 (==) id reverse :: Eq a => [a] -> Bool
Prelude> 

(2)まではMonadがあるが、(3)のところで、
liftM2の第2引数にidを与えると、関数の型からMonadがなくなってます。

ここの部分が理解できず。。