Haskell-为什么在这些情况下类型推断不同?

Haskell-为什么在这些情况下类型推断不同?,haskell,lambda,type-inference,Haskell,Lambda,Type Inference,当匿名函数绑定到一个名称时,为什么类型推断不同 Prelude> :type (+) (+) :: Num a => a -> a -> a Prelude> let bar (x,y) = x+y Prelude> :type bar bar :: Num a => (a, a) -> a Prelude> :type \(x,y)->x+y \(x,y)->x+y :: Num a => (a, a) -> a

当匿名函数绑定到一个名称时,为什么类型推断不同

Prelude> :type (+)
(+) :: Num a => a -> a -> a

Prelude> let bar (x,y) = x+y
Prelude> :type bar
bar :: Num a => (a, a) -> a

Prelude> :type \(x,y)->x+y
\(x,y)->x+y :: Num a => (a, a) -> a

Prelude> let foo =  \(x,y)->x+y
Prelude> :type foo
foo :: (Integer, Integer) -> Integer

它是GHCi中多态类型的默认类型

这些规则允许使用gchi作为用户友好的计算器,并且不使用签名


当然,这些规则不仅有帮助,有时也会有阻碍。

这可能是Haskell 98的一个单一功能,总体上导致了最大的混乱。因此,这是可怕的单态限制。所以这只是因为某种语言技术特质,而不是我应该知道的。对吧?不一定,它是什么值得一秒钟,这样当它咬你的时候你就能认出它