首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell:类型推断和函数组合

Haskell:类型推断和函数组合
EN

Stack Overflow用户
提问于 2009-08-28 00:18:57
回答 2查看 1K关注 0票数 15

这个问题的灵感来自于另一个问题的answer,它表明您可以使用如下定义的函数从列表中删除每个元素:

代码语言:javascript
复制
removeall = filter . (/=)

filter(/=)(.)类型中用纸和笔算出,该函数的类型为

代码语言:javascript
复制
removeall :: (Eq a) => a -> [a] -> [a]

这正是你根据它的合同所期望的。然而,在GHCi 6.6中,我得到了

代码语言:javascript
复制
gchi> :t removeall
removeall :: Integer -> [Integer] -> [Integer]

除非我显式地指定了类型(在这种情况下它工作得很好)。为什么Haskell要为函数推断出如此特定的类型?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-28 02:09:33

为什么Haskell要为函数推断这样一个特定的类型?

GHCi正在使用type defaulting,从一组可能的类型中推断出更具体的类型。您可以通过禁用the monomorphism restriction来轻松避免此问题,

代码语言:javascript
复制
Prelude> :set -XNoMonomorphismRestriction
Prelude> let removeall = filter . (/=)
Prelude> :t removeall 
removeall :: (Eq a) => a -> [a] -> [a]
票数 28
EN

Stack Overflow用户

发布于 2009-08-28 07:09:47

同样值得注意的是,如果您没有为表达式指定名称,则typechecker似乎可以避免默认类型:

代码语言:javascript
复制
Prelude> :t filter . (/=)
filter . (/=) :: (Eq a) => a -> [a] -> [a]
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1344414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档