为什么这些Haskell函数的推断类型都不一样?

dav*_*mas 7 haskell type-inference hugs

我定义了五个函数,在我看来它们应该是等价的(因此,它们具有相同的类型).但推断的类型是不同的.我在type-in​​ference.hs中放了以下五行:

f1 a b = a + b
f2 a = \b -> a + b
f3 = \a -> \b -> a + b
f4 a = (a+)
f5 = (+)
Run Code Online (Sandbox Code Playgroud)

然后我加载拥抱:

Hugs> :load type-inference.hs
Main> :type f1
f1 :: Num a => a -> a -> a
Main> :type f2
f2 :: Num a => a -> a -> a
Main> :type f3
f3 :: Integer -> Integer -> Integer
Main> :type f4
f4 :: Num a => a -> a -> a
Main> :type f5
f5 :: Integer -> Integer -> Integer
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

Mih*_*eac 8

它是MonomorphismRestriction在起作用.

Prelude> let f5 = (+)
Prelude> :t f5
f5 :: Integer -> Integer -> Integer
Prelude> :set -XNoMonomorphismRestriction 
Prelude> let f5 = (+)
Prelude> :t f5
f5 :: Num a => a -> a -> a
Run Code Online (Sandbox Code Playgroud)

因此,类型合成器在某些类型上被迫提前默认.