2

データ型カードのモジュールがインストールされています。私はそれをクラスShowのインスタンスにしますが、ghciで問題が発生します:

 module Poker where

 data Card = Card Int 

 ...

 instance Show Card where
 show card = ...

 ...

ghciを開いて、次のように入力します。

>:m + Poker
>Card 0
..
..
..
(Nothing) => I stop the execution
>Poker.show (Card 0)
> "Ace of Hearts"

私のデータ型はクラスShowのインスタンスではないようですが、なぜですか?


皆さんありがとう!できます!:)

4

1 に答える 1

5

インデントが重要です。インスタンス宣言の本体はインデントする必要があります。そうしないと、の定義がshow単なる別のトップレベル関数として解釈されます。これが機能する理由Poker.showです。

instance Show Card where
    show card = ...

Haskell の一般的なインデント規則は、2 つの連続する行が同じようにインデントされている場合、それらは 2 つの異なる定義であるということです。一方、行がその前の行よりもインデントされている場合、それは前の定義または式の一部であると見なされます。この場合、あなたが望むものです。

これが無限ループを引き起こす理由はshow、型クラスで の実装を提供しなかったため、間接的に を呼び出すデフォルトの実装を使用するためですshowsPrec。それも提供しなかったため、 を呼び出すデフォルトの実装が使用されますshow。したがって、無限ループが発生します。いくつかの型クラスには、そのように相互に実装されたデフォルトの実装があるため、それらのサブセットを実装するだけで済みます。

于 2011-11-21T15:49:04.383 に答える