Bool
类型不是Monad
ghci> :t liftM
liftM :: Monad m => (a1 -> r) -> m a1 -> m r
然而,以下内容仍会返回Bool
ghci> :t (liftM null id)
(liftM null id) :: Foldable t => t a -> Bool
答案 0 :(得分:1)
null :: Foldable t => t a -> Bool
因此统一给出了
liftM null :: (Monad m, Foldable t) => m (t a) -> m Bool
然后liftM null id
必须统一id
b -> b
类型m (t a)
,其中m
为Monad
且{{1}是t
。碰巧,Foldable
类型为defined as a Monad。这意味着((->) r)
的类型可以写为id
m b
为m
。
((->) b)
现在,id :: b -> b
id :: ((->) b) b -- this is the same as above
-- 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
形式将其写回来,
->
其余部分很明确 - 我们将上述功能应用于liftM null :: Foldable t => (t a -> t a) -> t a -> Bool
以获取
id