这里有一个非常受欢迎的monad解释:
http://blog.sigfpe.com/2007/04/trivial-monad.html
除了这部分我得到了所有东西:
bind :: (a -> W b) -> (W a -> W b)
bind f (W x) = f x
我对Haskell有基本的了解(很长一段时间没用过它),但这个签名似乎不对。
我安装了GHC并检查了它的想法 - 结果它认为我做了什么,即:
:t bind
bind :: (t1 -> t) -> W t1 -> t
我错过了什么?
答案 0 :(得分:6)
Haskell的类型推断器总是考虑最一般的签名。因为在bind
的实现中,你没有做任何将参数f
赋予任何比任何类型的函数更具体的内容到任何其他类型(不具体) W b
),即有一个签名a -> b
(或t1 -> t
,正如推荐人所写的那样),当然它就是这样。
换句话说,签名(a -> b) -> W a -> b
是(a -> W b) -> (W a -> W b)
的严格更一般的版本。