考えてみたとき:型クラスのインスタンス型クラスには、次のタイプのクラスを一つだけ
class Listable a where
asList :: a t -> [t]
それは一つのパラメータを持つ型のインスタンスを作成するのは簡単です:
instance Listable [] where
asList = id
instance Listable Maybe where
asList (Just x) = [x]
asList Nothing = []
ここで、2つの同じ型パラメータを持つペアのインスタンスを作成するにはどうすればよいですか?
data V2 a = V2 a a
v2 (p,q) = V2 p q
instance Listable V2 where
asList (V2 p q) = [p,q]
今、私はasList $ v2 (47, 11)
のようなものを書くことができますが、敗北のこの種の目的:もちろん、私はいくつかの折り返しを行うことができます。
タイプのパラメータが等しいケースにペアのタイプを限定し、それに対してListable
のインスタンスを記述する方法はありますか?そうでない場合、通常の回避策は何ですか?
申し訳ありませんが、試してみるのは怠惰ですが、最後のアプローチでは 'インスタンスのリスト(a、a)'が許されますか? – yatima2975
@ yatima2975:最も外側の型のコンストラクタとして '(、)'と異なるインスタンスを持つ代わりに、yesを返します。おそらくあなたが言及したので、私の答えにその例を入れておくべきでしょう... –