我有一个简单的问题。这个代码对我来说非常好。
main = do
print("10-2")
let a = L
let b = E "abc" a
print(a)
print(b)
data List a = L | E a (List a)
instance (Show a) => Show (List a) where
show L = "Empty"
show (E a list) = (show a)++ (show list)
但它会产生以下错误:
10-2.hs:5:5:
No instance for (Show a0) arising from a use of `print'
The type variable `a0' is ambiguous...
我找不到问题。谢谢你的帮助!
如果你试图编译这个简单的程序,你会遇到同样的错误:
main = print []
什么?Haskell无法打印空列表?这是正确的,它不能。也就是说,除非列表元素的类型是已知的。在这种情况下,它是未知的,因此编译失败。为了了解原因,请运行以下两个程序:
main = print ([] :: [Int])
main = print ([] :: [Char])
输出是不同的,尽管这些程序之间唯一的区别是空列表的类型。
但是,如果您在ghci
中尝试相同的不明确程序,它将打印[]
!
Prelude> let main = print []
Prelude> main
[]
Prelude>
这是因为ghci
的默认规则集比ghc
稍微宽松一些。因此,如果您将数据类型定义加载到ghci
,并在提示下说print L
,ghci
将很乐意遵守:
[1 of 1] Compiling Main ( h.hs, interpreted )
Ok, modules loaded: Main.
*Main> print L
Empty
*Main>
在您的函数main中,当您编写let a = L
时,a
的类型只是List a0
。当编译器试图知道它必须使用Show
实例的哪个版本时,所有类型都适用,因为a
的类型没有完全定义。但是,如果删除行print a
,您将看到print b
将起作用,因为b
的类型只能是List String
,并且编译器确切地知道必须使用哪个版本的show
。
main = do
print "10-2"
let a = L
let b = E "abc" a
-- print a
print b
试着编写print []
,你会发现编译器会给你同样的错误。
但是,在ghci中,如果只键入print L
或print []
,则不会提示错误。我不知道为什么会发生这种事。
正如其他人已经说过的,您需要为List提供一个类型,即使数据构造函数不需要它来创建自己。
所以试试:
print (L :: List Int)
或者任何您喜欢的东西,只需打印(列表a)的显示实例的字符串