在Haskell中打印空列表

时间:2014-05-12 14:22:09

标签: haskell empty-list

这是一段代码:

import System.Environment 
myReverse :: [a] -> [a]
myReverse [] = []
main = print (myReverse [])

当我使用GHC编译时,我收到以下错误:

  

[1/1]编译Main(problem5_myReverse.hs,problem5_myReverse.o)       problem5_myReverse.hs:6:8:       使用print' The type variable a0'产生的(显示a0)的实例不明确       可能的解决方法:添加修复这些类型变量的类型签名       注意:有几种可能的情况:         实例显示双 - 在GHC.Float' instance Show Float -- Defined in GHC.Float'中定义         实例(积分a,显示a)=>显示(GHC.Real.Ratio a)            - 在GHC.Real' ...plus 23 others In the expression: print (myReverse []) In an equation for main'中定义:main = print(myReverse [])

但是当我将签名从myReverse::[a]->[a]更改为myReverse::[Int]->[Int]时,源代码编译时没有任何问题

有人可以告诉我如何保留一般签名[a] -> [a],但是它可以用于空的整数列表吗?

1 个答案:

答案 0 :(得分:6)

myReverse [](或通常为[]),类型推断器无法推断列表元素类型,因为它是一个空列表。如果您明确呼叫,例如myReverse ([] :: [Int]),它将能够为列表找到Show实例,以便在打印之前将其转换为字符串。

这是因为列表的Show实例定义为Show a => Show [a],这意味着[a]只有Show个实例,如果a有{ {1}}它的实例。但在Show的情况下,没有a开头。