这是一段代码:
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]
,但是它可以用于空的整数列表吗?
答案 0 :(得分:6)
从myReverse []
(或通常为[]
),类型推断器无法推断列表元素类型,因为它是一个空列表。如果您明确呼叫,例如myReverse ([] :: [Int])
,它将能够为列表找到Show
实例,以便在打印之前将其转换为字符串。
这是因为列表的Show
实例定义为Show a => Show [a]
,这意味着[a]
只有Show
个实例,如果a
有{ {1}}它的实例。但在Show
的情况下,没有a
开头。