这个问题的灵感来自另一个问题的答案,表明您可以使用定义为的函数从列表中删除每个出现的元素:
removeall = filter . (/=)
用铅笔和纸从 和 的类型中计算出来,filter
函数的类型为(/=)
(.)
removeall :: (Eq a) => a -> [a] -> [a]
这正是您根据其合同所期望的。但是,使用 GHCi 6.6,我得到
gchi> :t removeall
removeall :: Integer -> [Integer] -> [Integer]
除非我明确指定类型(在这种情况下它可以正常工作)。为什么 Haskell 会为函数推断出如此特定的类型?