下面是这段代码:
import System.Environment
myReverse :: [a] -> [a]
myReverse [] = []
main = print (myReverse [])
当我用GHC编译时,我得到以下错误:
[1 of 1]编译Main (problem5_myReverse.)海关,problem5_myReverse。o)problem5_myReverse.hs: 6:8:使用
print' The type variable
a0'产生的(Show a0)实例没有不明确的可能的修复:添加一个类型签名来修复这些类型变量注意:有几个潜在的实例:实例显示双精度——在GHC.Float' instance Show Float -- Defined in
GHC中定义。浮动的实例(Integral a, Show a) => Show (GHC.Real.)比一个)——定义在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]
,但使其适用于空整数列表吗?
从myReverse []
(或一般的[]
)中,类型推断器不可能推断出列表元素类型,因为它是一个空列表。如果你显式地调用myReverse ([] :: [Int])
,它将能够为列表找到一个Show
实例,以便在打印之前将其转换为字符串。
这是因为列表的Show
实例是用Show a => Show [a]
定义的,这意味着如果a
有Show
实例,[a]
只有Show
实例。但是在[]
的情况下,没有a
可以开始