2016-03-12 47 views
0

如何从Control.Monad.liftM notControl.Monad.liftM not id的类型进行类型推断?有关单子的Haskell类型推断

(Control.Monad.liftM not) :: Monad m => m Bool -> m Bool 

(Control.Monad.liftM not id) :: Bool -> Bool 
+0

诀窍是认识到在第二情况下,'M'被实例化到一个具体类型 - 即给函数单子'(( - >)x'推理进行相当简单。 :'liftM not'的参数的类型为'm Bool'和'id :: a - > a',所以'a - > a〜m Bool',从中你可以得到m〜(( - >)a) ,a〜Bool'。 – user2407038

+0

明白了!谢谢! – jim

回答

4
liftM not :: Monad m =>     m Bool -> m Bool 
id   ::       a -> a 
liftM not id :: (Monad m, m ~ ((->) a), a ~ Bool) => m Bool 
      {- therefore -}       Bool -> Bool