我刚刚开始学习haskell,并且我正在尝试实现一些常见的monad作为自己的练习。当我摆弄((->) r)
monad时,我实现了这个(错误的)定义:
instance Monad ((->) r) where
return x = \_ -> x
m >>= f = \c -> (f . m) c
GHCi向我投诉
• Couldn't match expected type ‘b’ with actual type ‘t -> b’
`b’ is a rigid type variable bound by
the type signature for:
(>>=) :: forall a b. (t -> a) -> (a -> t -> b) -> t -> b
而类型应为:
(>>=) :: (t -> a ) -> (a -> t -> b) -> t -> b
为什么我的实现会破坏它?看来forall
版本应该给出完全相同的类型,但是GHCi认为不是。有什么区别?
答案 0 :(得分:3)
我致命的误解是我认为错误消息意味着我的实现具有不正确的类型签名。 (我以为是因为类型签名中有一个forall
。)事实证明这并不是实际的错误,而我在实现中的错误是我需要对两个{ {1}}和r
在我的实现中。感谢@luqui和@melpomene向我指出