在Haksell打印空列表

und*_*012 0 haskell empty-list

这是一段代码:

import System.Environment 
myReverse :: [a] -> [a]
myReverse [] = []
main = print (myReverse [])
Run Code Online (Sandbox Code Playgroud)

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

[1/1]编译Main(problem5_myReverse.hs,problem5_myReverse.o)problem5_myReverse.hs:6:8:因使用print' The type variablea0 而产生的(显示a0)的实例不明确可能的修复:添加修复这些的类型签名type variable(s)注意:有几个潜在的实例:实例Show Double - 在GHC.Float' instance Show Float -- Defined inGHC.Float'实例中定义(Integral a,Show a)=> Show(GHC.Real.Ratio a) - 在GHC.Real' ...plus 23 others In the expression: print (myReverse []) In an equation formain'中定义: main = print(myReverse [])

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

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

Eri*_*lun 6

myReverse [](或[]一般)来说,类型推理器不可能推断列表元素类型,因为它是一个空列表.如果你明确地调用eg myReverse ([] :: [Int]),它将能够找到Show列表的实例,以便它可以在打印之前将其转换为字符串.

这是因为Show列表实例的定义Show a => Show [a]意味着[a]只有一个Show实例,如果它a有一个Show实例.但是a在这种情况下没有开始[].