1

次のような他のデータ型を使用してデータ型を定義しようとしています:

data A = Something String | SomethingElse Int

data B = Another B | YetAnother A

data C = A | B

x :: [ C ]
x = [ YetAnother (SomethingElse 0), Something "Hello World" ]

しかし、これにより、タイプ B を期待しているときにタイプ A を持つことができないというエラーが表示されます。これはなぜですか?

4

3 に答える 3

7

のデータ コンストラクターがありませんC

data A = Something String
       | SomethingElse Int

data B = Another    B
       | YetAnother A

data C = C0 A
       | C1 B

x :: [ C ]
x = [ C1 (YetAnother (SomethingElse 0))
    , C0 (Something "Hello World")
     ]
于 2012-05-11T14:57:58.623 に答える
4

AおよびBinは、既存の型およびdata C = A | Bへの参照ではなく、新しいデータ コンストラクターの宣言です。(コンストラクターは、宣言ではオプションではありません。)ABdata

于 2012-05-11T14:58:11.327 に答える
0

Haskell には真の「共用体」型がありません。Haskell の共用体はコンストラクターでタグ付けする必要があります。(ウィキペディア > タグ付きユニオンを参照)。

どちらもHaskell の汎用のタグ付き共用体型で、データはLeftまたはとしてタグ付けされRightます。

data Either a b = Left a | Right b
于 2012-05-15T23:47:14.700 に答える