在Haskell中使用`print'不会产生(Show a0)实例

时间:2017-02-15 19:09:40

标签: haskell types

我是Haskell的新手。主题来自Learn your Haskell书籍“递归数据结构”

这是我的代码

data List a = Empty | Cons a (List a) deriving (Show, Read, Eq, Ord) 

main = do
    print $ Empty
    print $ 5 `Cons` Empty 
    print $ 4 (Cons 5 Empty)  
    print $ 3 `Cons` (4 `Cons` (5 `Cons` Empty))

这是我收到的错误消息

No instance for (Show a0) arising from a use of `print'
The type variable `a0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Note: there are several potential instances:
  instance Show a => Show (List a)

1 个答案:

答案 0 :(得分:10)

Empty可以是任何类型的List,尽管恰好是show Empty"Empty"工作的所有情况下都是show的情况根本没有,编译器真的不知道。 (对于实际情况可能因类型而异的实际示例,请在ghci中比较show ([] :: [Int])show ([] :: [Char])。)因此,它要求您选择一种类型来帮助它决定如何运行{{1 }}。非常容易解决:

show Empty

不要忘记将main = do print $ (Empty :: List Int) ... 添加到Cons行!