Haskell的绑定函数的类型是什么?

Par*_*bay 3 monads haskell ghc

一个非常受欢迎的monad解释如下:

http://blog.sigfpe.com/2007/04/trivial-monad.html

除了这部分我得到的一切:

bind :: (a -> W b) -> (W a -> W b)
bind f (W x) = f x
Run Code Online (Sandbox Code Playgroud)

我有Haskell的基本知识(很长一段时间没用过它),但这个签名看起来不对.

我安装了GHC并检查了它的想法 - 结果它认为我做了什么,即:

:t bind
bind :: (t1 -> t) -> W t1 -> t
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Nik*_*kov 6

Haskell的类型推断器总是考虑最一般的签名.因为在你的实现中,bind你没有做任何将参数赋予f任何比任何类型的函数更具体的东西到任何其他类型(非具体W b),即具有签名a -> b(或者t1 -> t,如引用者所写),当然它就是这样.

换句话说,签名(a -> b) -> W a -> b是严格的更一般的版本(a -> W b) -> (W a -> W b).

  • @Parobay由于cur(`a - > W b) - >(W a - > W b)`==`(a - > W b) - > W a - > W b`.即当`bind`提供一个参数时,它返回一个函数`W a - > W b`,当提供两个时,它只返回一个`W b`. (2认同)
  • @Parobay函数类型关联到右边,所以`a - > b - > c - > d`与`a - >(b - >(c - > d))`相同,这与` (a - > b) - >(c - > d)`.这就是为什么你需要左边的parens而不是右边的parens. (2认同)