質問

差別された組合を使用して表現ツリーを構築しています。以下のコード:

type IntExpression =
    | TrueIsOne of BoolExpression

type BoolExpression =
    | LessThan of IntExpression * IntExpression
    | And of BoolExpression * BoolExpression
    | Or of BoolExpression * BoolExpression
    | Bool of bool
. BOOLExpressionが定義されていないため、

エラーをスローします。定義を交換するだけで、逆(Intexpressionは定義されていない)になるだけです。

これを回避する方法はありますか?

役に立ちましたか?

解決

はい、andを使用して、依存関係間でタイプ定義をグループ化します。

type IntExpression =
    | TrueIsOne of BoolExpression

and BoolExpression =
    | LessThan of IntExpression * IntExpression
    | And of BoolExpression * BoolExpression
    | Or of BoolExpression * BoolExpression
    | Bool of bool
.

他のヒント

"と"は一般的に相互依存関係を持つタイプのために機能します。つまり、MAU、クラス、レコード、および相互に再帰的な機能によって示されるように、識別されたユニオンのようなあらゆる種類のために機能します。

非末端例:

let rec foo x = bar x
and bar x = foo x
.

おそらくこれは機能します:

type IntExpression =
  ...
and BoolExpression = 
  ...
.

msdn 。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top