当前位置:  开发笔记 > 程序员 > 正文

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

如何解决《为什么`:type`有时会显示`a`而有时会显示`t`?》经验,为你挑选了1个好方法。

我有这两个功能:

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]]

显示a对比的逻辑是什么t?我不认为这是因为Eq t部分,因为我有其他功能,显示类似的东西otherFunction :: Eq a => [[a]] -> [[a]].



1> Carl..:

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


打出的洞很棒,虽然[不太棒](https://ghc.haskell.org/trac/ghc/ticket/9091)但它们应该是[应该](https://ghc.haskell.org/trac/GHC /票/ 9479).
推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有