2016-03-12 49 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