リストを持つデータ型があり、クラスのスタンスでそれを作成したい場合、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}
誰かが問題を見ていますか?
リストを持つデータ型があり、クラスのスタンスでそれを作成したい場合、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}
誰かが問題を見ていますか?
私はあなたがこれを必要としていると思います:
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
のコンストラクターMlist aはと呼ばれるので、パターンマッチMlistの代わりにそれを記述します。mlist同様に、MList定義されていないので、それも修正します。
さらに、それはのインスタンスであり、Mlist aではなく、である場合に限ります。あなたが望んでいるのはMlistShowainstance (Show a) => Show (Mlist a) where ...
今のところメソッドを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の答えは正しいものです。