リストを持つデータ型があり、クラスのスタンスでそれを作成したい場合、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
のインスタンスを作成することを意味します。言い換えれば、に依存します。Show
a
Show
Show (Mlist a)
Show a
また、偶然に宣言されxs
たの既存のインスタンスを使用して、リストを表示したいとします。したがって、を使用する必要があります。Show [a]
instance Show a => Show [a] where...
show xs
のコンストラクターMlist a
はと呼ばれるので、パターンマッチMlist
の代わりにそれを記述します。mlist
同様に、MList
定義されていないので、それも修正します。
さらに、それはのインスタンスであり、Mlist a
ではなく、である場合に限ります。あなたが望んでいるのはMlist
Show
a
instance (Show a) => Show (Mlist a) where ...
今のところメソッドをShow
使用して、クラスの定義を調べてみましょう。show
class Show a where
show :: a -> String
を書くときは、すべてinstance Show MList
を置き換えるので、の型注釈は次のようになります。MList
a
show
show :: MList -> String
あはは!問題がある! MList
は有効なタイプではありませんが、有効なタイプですMList Char
。つまり、次のように修正する必要がありinstance
ます。
instance Show (MList Char) where ...
show (Mlist xs) = xs
編集:これは正しくありませんInt
。要求したようにを処理しないためです。 gspr
の答えは正しいものです。