liftM null id返回bool,但bool不是monad

时间:2017-01-17 06:46:38

标签: haskell types monads

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

1 个答案:

答案 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),其中mMonad且{{1}是t。碰巧,Foldable类型为defined as a Monad。这意味着((->) r)的类型可以写为id m bm

((->) 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