Haskell liftM null id返回bool,但bool不是monad
Bool类型不是Monad 然而,下面仍然返回布尔 因此,统一给予Haskell liftM null id返回bool,但bool不是monad,haskell,types,monads,Haskell,Types,Monads,Bool类型不是Monad 然而,下面仍然返回布尔 因此,统一给予 liftM null :: (Monad m, Foldable t) => m (t a) -> m Bool 然后liftM null id必须将类型为b->b的id与m t a统一,其中m是单子,t是可折叠的。碰巧的是,type->r是。这意味着id的类型可以写成mb,其中m是->b 现在,b可以专用于t a,以便我们得到所需的类型: id :: ((->) (t a)) (t a) -- m = ((
liftM null :: (Monad m, Foldable t) => m (t a) -> m Bool
然后liftM null id必须将类型为b->b的id与m t a统一,其中m是单子,t是可折叠的。碰巧的是,type->r是。这意味着id的类型可以写成mb,其中m是->b
现在,b可以专用于t a,以便我们得到所需的类型:
id :: ((->) (t a)) (t a)
-- m = ((->) (t a))
回到liftM null,我们有:
liftM null :: Foldable t => ((->) (t a)) (t a) -> ((->) (t a)) Bool
或者,用通常的中缀->形式写回去
剩下的很清楚-我们将上述函数应用于id以获得
liftM null :: (Monad m, Foldable t) => m (t a) -> m Bool
id :: b -> b
id :: ((->) b) b -- this is the same as above
-- m = ((->) b)
id :: ((->) (t a)) (t a)
-- m = ((->) (t a))
liftM null :: Foldable t => ((->) (t a)) (t a) -> ((->) (t a)) Bool
liftM null :: Foldable t => (t a -> t a) -> t a -> Bool
liftM null id :: Foldable t => t a -> Bool