6

以前の質問の続きになったので、これを新しい質問に始めました。

同様のコンストラクターで構成される2つのデータ型がある場合:

data A = X | Y | Z
data B = X | Y

どういうわけかこれを次のように表すことができる方法はありませんか?

data A = C | Z
data B = C

data C = X | Y

あなたが私がしていることを見ることができるなら-私はXをグループ化しようとしています| Yを1つのデータ型に変換し、他の複数のデータ型で使用できるようにします。コンパイラにこれを許可させることができないようです。許可する場合、XまたはYに対してパターンマッチングを行うことができず、Cのみですか?

Cが複数回宣言されたというエラーメッセージが表示されます。

タイプを使用できると思いましたが、複数のタイプを使用することはできません。

編集

私が長い道のりを宣言したとしても(以下のように)、それはまだコンパイルされず、XとYには複数の宣言があると言います:

data A = X | Y | Z
data B = X | Y
4

4 に答える 4

13

これを実行できないだけでなく、最初のオプションも実行できません。つまり、同じモジュールに、とという名前のコンストラクターを持つ2つの型を含めることはできませXY

これができるとしたら、タイプはX- CAまたはB?最も明白な答えはですが、aま​​たはaが必要なCコンテキストでは使用できないため(Haskellにはサブタイピングがないことに注意してください)、構成全体の目的が損なわれます。AB

あなたができる最善のことは、CをAとBのコンストラクターでラップすることです。

data A = AC C | Z
data B = BC C
data C = X | Y

AC次に、CをまたはBCコンストラクターでラップして、タイプAまたはBそれぞれの値を作成できます。

于 2012-09-09T21:44:52.050 に答える
4

あなたがこれを行うことができない理由

data A = X | Y | Z
data B = X | Y

以下のとおりであります。後でコードを書くとしましょう:

foo n = (n,X)

nこれは、最初のスロットと2番目のスロットで構成されるペアを構築しXます。コンパイラはどのタイプを推測する必要がありますか?有効なタイプは

foo :: a -> A -> (a,A)

X型のコンストラクターAですが、同様に有効です

foo :: a -> B -> (a,B)

Xは型のコンストラクターなのでB。同じ名前のコンストラクターが2つある場合、それらを使用する関数の一意の型を推測することはできません。したがって、同じモジュール内の2つのコンストラクターに同じ名前を付けることは許可されていません。

于 2012-09-10T07:56:52.233 に答える
1

あなたはこれを行うことはできません:

data A = C | Z
data B = C

data C = X | Y

(余談ですが、がと同一である場合BなぜまったくC持っBているのですか?)

しかし、あなたができることは次のようなものです:

data A = A_Other C | Z
data B = B_Other C

data C = X | Y

次に、次のようにパターンマッチングを行うことができます。

foo :: A -> String
foo (A_Other X) = "X"
foo (A_Other Y) = "Y"
foo (        Z) = "Z"

bar :: B -> String
bar (B_Other X) = "X"
bar (B_Other Y) = "Y"

foobar :: C -> String
foobar X = "X"
foobar Y = "Y"

それが理にかなっているなら...

于 2012-09-10T11:38:24.610 に答える
0

複数のデータコンストラクターを宣言しているため、やりたいことができません。の

data A = X | Y | Z

実際には、A3つのコンストラクター(値)、、、およびを持つ型をX導入YしていますZ。これが、最初のコードがコンパイルされない理由です。2つの異なるタイプのコンストラクターとして、同じ名前がリストされています。あなたがこれを行うことができれば、あなたは自分自身に尋ねなければならないでしょう

X :: A

また

X :: B

非オブジェクト指向のコンテキストでは怖いです!したがって、その基礎となるデータを共有するには、さまざまなコンストラクター名を指定する必要がありますC

これを因数分解したい場合は、他の投稿が提案し、データ型ごとに一意のコンストラクターでデータを因数分解したように行うことができます

data A = CForA C | Z
data B = CForB C

data C = X | Y
于 2012-09-10T20:16:59.290 に答える