2016-03-12 2 views
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 
+0

Уловка, понимая, что во 2-м случае, '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 
Смежные вопросы