哈斯克尔:类型推断和函数组合
-
20-09-2019 - |
题
这个问题的灵感来自于此 回答 另一个问题,表明您可以使用定义为的函数从列表中删除每个出现的元素:
removeall = filter . (/=)
用铅笔和纸根据以下类型进行计算 filter
, (/=)
和 (.)
, ,该函数的类型为
removeall :: (Eq a) => a -> [a] -> [a]
这正是您根据合同所期望的。然而,使用 GHCi 6.6,我得到
gchi> :t removeall
removeall :: Integer -> [Integer] -> [Integer]
除非我明确指定类型(在这种情况下它工作正常)。为什么 Haskell 为函数推断出这样一个特定的类型?
其他提示
还值得注意的是,如果您不为表达式分配名称,类型检查器似乎会避免类型默认:
Prelude> :t filter . (/=)
filter . (/=) :: (Eq a) => a -> [a] -> [a]
不隶属于 StackOverflow