2

次の判別共用体はコンパイルに失敗します。

type Expression =
  | Identifier of string
  | Integer of int
  | Assignment of Identifier * Expression

表示されたエラーは

The type "Identifier" is not defined.

最後のユニオンケースについて。

属性でタグ付けしようとExpressionしましたrecが、役に立たないようです。

これに対する回避策はありますか? さらに良いことに、言及された理由が私のトラブルの原因ですか?

4

2 に答える 2

10

あなたが実際に欲しいように聞こえます

| Assignment of string * Expression

または代わりに

type Id = Id of string
type Expression =
    | Identifier of Id
    | Integer of int
    | Assignment of Id * Expression

すべての識別子に追加の名義型が必要な場合。

可能な場合は型システムで意味のない値を除外するのが最善です(意味のない状態は表現できないようにするExpression必要があります) 。そのため、言語で必要ない場合は、割り当ての左側を避けます。

いずれにせよ、それが許可されない理由Identifierは、がタイプではないためです(Expressionです)。

于 2011-08-26T07:55:50.270 に答える
4

それをしてはいけない。Union 内では、別の Union 要素を参照できません。

したがって、次のようになります。

type Expression =
  | Identifier of string
  | Integer of int
  | Assignment of Expression * Expression

そのため、代入ユニオンを解析するときに、タプルの最初の Expression が Identifier である必要があるという検証をそこに置くことができます。

于 2011-08-26T06:55:59.127 に答える