Haskell的:类型推断和功能的组合物(Haskell: type inference and f

2019-07-03 22:41发布

这个问题是受此启发回答另一个问题时,表示你可以删除使用函数列表中的元素的每次出现定义为:

removeall = filter . (/=)

从类型的笔和纸加工出来filter(/=)(.)该函数的类型为

removeall :: (Eq a) => a -> [a] -> [a]

这是你的基础合同期待什么。 然而,随着GHCI 6.6,我得到

gchi> :t removeall
removeall :: Integer -> [Integer] -> [Integer]

除非我明确指定的类型(在这种情况下正常工作)。 为什么哈斯克尔的推断等功能一个特定类型的?

Answer 1:

为什么哈斯克尔的推断等功能一个特定类型的?

GHCI使用类型违约 ,来推断从一组候选条件的一个更具体的类型。 您可以通过禁用轻松避免这种情况的单态的限制 ,

Prelude> :set -XNoMonomorphismRestriction
Prelude> let removeall = filter . (/=)
Prelude> :t removeall 
removeall :: (Eq a) => a -> [a] -> [a]


Answer 2:

还值得一提的是,如果你不指定一个名称的表达,typechecker似乎避免违约类型:

Prelude> :t filter . (/=)
filter . (/=) :: (Eq a) => a -> [a] -> [a]


文章来源: Haskell: type inference and function composition