繁体   English   中英

Haskell:类型推断和函数组成

[英]Haskell: type inference and function composition

这个问题的灵感来自另一个问题的答案 ,表明您可以使用定义为以下功能的函数从列表中删除元素的所有出现:

removeall = filter . (/=)

用铅笔和纸从filter (/=)(.)的类型中得出该函数的类型为

removeall :: (Eq a) => a -> [a] -> [a]

这正是您根据合同所期望的。 但是,有了GHCi 6.6,我得到了

gchi> :t removeall
removeall :: Integer -> [Integer] -> [Integer]

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

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

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

Prelude> :set -XNoMonomorphismRestriction
Prelude> let removeall = filter . (/=)
Prelude> :t removeall 
removeall :: (Eq a) => a -> [a] -> [a]

还值得注意的是,如果不为表达式指定名称,typechecker似乎会避免默认类型:

Prelude> :t filter . (/=)
filter . (/=) :: (Eq a) => a -> [a] -> [a]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM