2017-02-15 7 views
3

私はHaskellで初めてです。トピックを学びます。ここHaskellの書籍「再帰的なデータ構造」Haskellで `print 'を使用しているため、(Show a0)のインスタンスがありません

は私のコード

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) 
+0

第3の 'print'は問題を引き起こしていませんか?ここでは '4'と' Con 5 Empy 'を提供するので、'(4)に '(Cons 5 Empty)'を適用しますか? –

+0

ここに投稿したコードを実行しようとすると、別のエラーメッセージが表示されます。これはtypoがあるからです:do-blockの3行目に、 '$ 4' Cons'(5 'Cons' Empty)' 'を書くことを意味していました。 – duplode

答えて

10

Emptyを取得し、エラーメッセージがListのいずれかのタイプにすることができているであるからですどんな場合でもshow Empty"Empty"になる場合がありますが、showがまったく動作していますが、コンパイラはそれを実際には知りません。実際の例では、種類によって種類が異なる場合があります(show ([] :: [Int])show ([] :: [Char])をghciで比較してください)。show Emptyの実行方法を決定するために使用するタイプを選択する必要があります。とても簡単修正:

main = do 
    print $ (Empty :: List Int) 
    ... 

も、4 (Cons 5 Empty)ラインにConsを追加することを忘れないでください!

+0

ダニエルに感謝、状況は明らかです、Tamas – bling5630

関連する問題