Haskell:类型推断和函数组合

Pil*_*lsy 15 haskell types type-inference function-composition

此问题的灵感来自另一个问题的答案,表明您可以使用定义为以下内容的函数从列表中删除每个元素:

removeall = filter . (/=)
Run Code Online (Sandbox Code Playgroud)

使用铅笔和纸张来处理它的类型filter,(/=)并且(.),该功能有一种类型

removeall :: (Eq a) => a -> [a] -> [a]
Run Code Online (Sandbox Code Playgroud)

这正是你根据合同所期望的.但是,对于GHCi 6.6,我得到了

gchi> :t removeall
removeall :: Integer -> [Integer] -> [Integer]
Run Code Online (Sandbox Code Playgroud)

除非我明确指定类型(在这种情况下它工作正常).为什么Haskell推断出函数的这种特定类型?

Don*_*art 28

为什么Haskell推断出函数的这种特定类型?

GHCi使用类型默认,从一组可能中推断出更具体的类型.您可以通过禁用单态限制来轻松避免这种情况,

Prelude> :set -XNoMonomorphismRestriction
Prelude> let removeall = filter . (/=)
Prelude> :t removeall 
removeall :: (Eq a) => a -> [a] -> [a]
Run Code Online (Sandbox Code Playgroud)


ADE*_*Ept 17

值得注意的是,如果你没有为表达式指定名称,typechecker似乎避免了类型默认:

Prelude> :t filter . (/=)
filter . (/=) :: (Eq a) => a -> [a] -> [a]
Run Code Online (Sandbox Code Playgroud)