3

ここに私の簡略化されたコードがあります:

type t1 = [ `A of t2]
and t2 = [ `B | t1 ]

この場合、私のタイプは相互定義を必要としないため、「and」は必要ありませんが、現実の世界ではそれが必要です。なぜそれがうまくいかないのですか?私はそれを動作させることができます

and t2 = [`B | `C of t1]

しかし今では、ポリモーフィック バリアントのすべての興味を失い、通常のバリアントに切り替えるだけです。

これを行う方法はありますか?

4

1 に答える 1

3

t2 の定義では、この時点で完全に定義されていないタイプ t1 を「拡張」しようとしています (`A ブランチで t2 が必要なため)。

再帰的な通常のデータ型を「エミュレート」したい場合 (代わりにポリモーフィック バリアントを使用する場合)、データ コンストラクターの下で相互再帰的な型へのすべての参照を使用する必要があります。
この場合の例は次のようになります。

type t1 = [ `A of t2 ]
and t2 = [ `B | `C of t1 ]

また、Ocaml の構築 [ `B | t1 ] は、ポリモーフィック行を別の行で拡張することを意味するものではありません。これは、型のシノニム置換にすぎません。

于 2013-08-12T22:12:01.077 に答える