0
如何从Control.Monad.liftM not
到Control.Monad.liftM not id
的类型进行类型推断?有关单子的Haskell类型推断
(Control.Monad.liftM not) :: Monad m => m Bool -> m Bool
(Control.Monad.liftM not id) :: Bool -> Bool
如何从Control.Monad.liftM not
到Control.Monad.liftM not id
的类型进行类型推断?有关单子的Haskell类型推断
(Control.Monad.liftM not) :: Monad m => m Bool -> m Bool
(Control.Monad.liftM not id) :: Bool -> Bool
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
诀窍是认识到在第二情况下,'M'被实例化到一个具体类型 - 即给函数单子'(( - >)x'推理进行相当简单。 :'liftM not'的参数的类型为'm Bool'和'id :: a - > a',所以'a - > a〜m Bool',从中你可以得到m〜(( - >)a) ,a〜Bool'。 – user2407038
明白了!谢谢! – jim