这个问题是受此启发回答另一个问题时,表示你可以删除使用函数列表中的元素的每次出现定义为:
removeall = filter . (/=)
从类型的笔和纸加工出来filter
, (/=)
和(.)
该函数的类型为
removeall :: (Eq a) => a -> [a] -> [a]
这是你的基础合同期待什么。 然而,随着GHCI 6.6,我得到
gchi> :t removeall
removeall :: Integer -> [Integer] -> [Integer]
除非我明确指定的类型(在这种情况下正常工作)。 为什么哈斯克尔的推断等功能一个特定类型的?
为什么哈斯克尔的推断等功能一个特定类型的?
GHCI使用类型违约 ,来推断从一组候选条件的一个更具体的类型。 您可以通过禁用轻松避免这种情况的单态的限制 ,
Prelude> :set -XNoMonomorphismRestriction
Prelude> let removeall = filter . (/=)
Prelude> :t removeall
removeall :: (Eq a) => a -> [a] -> [a]
还值得一提的是,如果你不指定一个名称的表达,typechecker似乎避免违约类型:
Prelude> :t filter . (/=)
filter . (/=) :: (Eq a) => a -> [a] -> [a]