这个问题的灵感来自于另一个问题的answer,它表明您可以使用如下定义的函数从列表中删除每个元素:
removeall = filter . (/=)从filter、(/=)和(.)类型中用纸和笔算出,该函数的类型为
removeall :: (Eq a) => a -> [a] -> [a]这正是你根据它的合同所期望的。然而,在GHCi 6.6中,我得到了
gchi> :t removeall
removeall :: Integer -> [Integer] -> [Integer]除非我显式地指定了类型(在这种情况下它工作得很好)。为什么Haskell要为函数推断出如此特定的类型?
发布于 2009-08-28 02:09:33
为什么Haskell要为函数推断这样一个特定的类型?
GHCi正在使用type defaulting,从一组可能的类型中推断出更具体的类型。您可以通过禁用the monomorphism restriction来轻松避免此问题,
Prelude> :set -XNoMonomorphismRestriction
Prelude> let removeall = filter . (/=)
Prelude> :t removeall
removeall :: (Eq a) => a -> [a] -> [a]发布于 2009-08-28 07:09:47
同样值得注意的是,如果您没有为表达式指定名称,则typechecker似乎可以避免默认类型:
Prelude> :t filter . (/=)
filter . (/=) :: (Eq a) => a -> [a] -> [a]https://stackoverflow.com/questions/1344414
复制相似问题