これは私の前の質問からのフォローアップとなったので、この新しい質問を開始しました。私は同様のコンストラクタで構成されている2つのデータ型を持っている場合はハスケルでのデータ型の使用
:あなたは私がやっているかを見ることができれば
data A = C | Z
data B = C
data C = X | Y
:
data A = X | Y | Z
data B = X | Y
はと私は何とかこれを表現することができる方法はありません私はXをグループ化しようとしています。 Yを1つのデータ型に変換し、それを複数の他のデータ型で使用することができます。私はこれを許可するコンパイラを得ることができない、または場合は、私はXまたはY、Cのみパターン一致することはできません?
Cが複数回宣言されているというエラーメッセージが表示されます。
多分型を使うことができると思っていましたが、複数の型指定をすることはできません。
EDIT
私は(下記のような)長い道のりを宣言した場合でも、それはまだコンパイルしてXとYは、複数の宣言を持って言いません。
data A = X | Y | Z
data B = X | Y
のためのユニークなコンストラクタで織り込んアウトデータあなたが求めている何 'Aのサブタイプになります'。これは、新しい型を作成するキーワード 'data'で宣言されることはなく、既存の型とは離れています。私はハスケルがこのような機能を持っているとは思っていませんが、私はハスケルのすべての拡張機能を使っているわけではありません。 – Gilles
@Gilles:いいえ、Haskellにはサブタイプ多型がありません。それは、パラメトリック多型、および型クラスによるアドホック多型のみを有する。あなたが得ることができる最も近いものは、実在のタイプですが、それはまったく違っていますが、まったく違うものです。 –
私はこれを答えとして書いていますが、それほどではありません。あなたはtypeclassを宣言し、次にそれらの "一般的なもの"に必要な操作を行うことで、あなたが望むものに近づくことができます。これは、この問題の(バージョン)を解決するために周りのものを反転するかなり一般的な方法です。 –