1

リストを持つデータ型があり、クラスのスタンスでそれを作成したい場合、Showこれを試していますが、エラーが発生します:

data Mlist a = Mlist [a]
m = Mlist [1, 2, 3]


instance Show Mlist where
    show (Mlist xs) = xs

-- m should now be {1, 2, 3}

誰かが問題を見ていますか?

4

3 に答える 3

6

私はあなたがこれを必要としていると思います:

instance Show a => Show (Mlist a) where
    show (Mlist xs) = show xs

Show a =>これは、がすでにのインスタンスである場合Mlist aのインスタンスを作成することを意味します。言い換えれば、に依存します。ShowaShowShow (Mlist a)Show a

また、偶然に宣言されxsたの既存のインスタンスを使用して、リストを表示したいとします。したがって、を使用する必要があります。Show [a]instance Show a => Show [a] where...show xs

于 2013-03-10T04:06:44.020 に答える
2

のコンストラクターMlist aはと呼ばれるので、パターンマッチMlistの代わりにそれを記述します。mlist同様に、MList定義されていないので、それも修正します。

さらに、それはのインスタンスであり、Mlist aではなく、である場合に限ります。あなたが望んでいるのはMlistShowainstance (Show a) => Show (Mlist a) where ...

于 2013-03-10T03:44:56.077 に答える
0

今のところメソッドをShow使用して、クラスの定義を調べてみましょう。show

class Show a where
    show :: a -> String

を書くときは、すべてinstance Show MListを置き換えるので、の型注釈は次のようになります。MListashow

show :: MList -> String

あはは!問題がある! MListは有効なタイプではありませんが、有効なタイプですMList Char。つまり、次のように修正する必要がありinstanceます。

instance Show (MList Char) where ...
    show (Mlist xs) = xs

編集:これは正しくありませんInt。要求したようにを処理しないためです。 gsprの答えは正しいものです。

于 2013-03-10T03:48:26.967 に答える