为什么`:type`有时会显示`a`而有时会显示`t`?

时间:2015-12-09 15:08:23

标签: haskell ghci

我有这两个功能:

cleanUp a = Data.List.filter (/=[]) a

joinByPairs [] = []
joinByPairs (x:[]) = (x:[])
joinByPairs (x:y:xs) = (x ++ y) : joinByPairs xs

当我在ghci中加载它们并在它们上面调用:type时,我会得到以下结果:

*Main> :type joinByPairs
joinByPairs :: [[a]] -> [[a]]
*Main> :type cleanUp
cleanUp :: Eq t => [[t]] -> [[t]]

它显示at的逻辑是什么?我认为这不是因为Eq t部分,因为我有其他函数显示类似otherFunction :: Eq a => [[a]] -> [[a]]的内容。

1 个答案:

答案 0 :(得分:8)

这是因为选择了类型变量名称的方式。全新变量获得t。在类型签名中命名的类型变量保留类型签名中的名称。统一类型变量时,GHC更喜欢保留一个来自显式类型签名的名称。如果没有子表达式具有明确的类型签名,则除了t之外没有其他名称可以统一。