这个问题的灵感来自于此answer另一个问题,表明您可以使用定义为的函数从列表中删除每个出现的元素:
removeall = filter . (/=)
用铅笔和纸根据以下类型进行计算filter
, (/=)
and (.)
,该函数的类型为
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]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)