0

私はコードを持っています:

let join a ~with':b ~by:key = 
  let rec a' = link a ~to':b' ~by:key
      and b' = link b ~to':a' ~by:(Key.opposite key) in
  a'

コンパイル結果は次のとおりです。

エラー: この種の式は、'let rec' ビルド完了の右辺として許可されていません

私はそれを次のように書き換えることができます:

let join a ~with':b ~by:key = 
  let rec a'() = link a ~to':(b'()) ~by:key
      and b'() = link b ~to':(a'()) ~by:(Key.opposite key) in
  a'()

これはコンパイル可能なバリアントですが、実装された関数は無限に再帰的であり、必要なものではありません。

私の質問: 最初の実装が無効なのはなぜですか? 2 つの関数を呼び出して、その結果を互いの引数として使用する方法は?

私のコンパイラのバージョン = 4.01.0

4

1 に答える 1

1

最初の質問に対する答えは、OCaml マニュアルのセクション 7.3 にあります。これがそれが言うことです:

非形式的には、受け入れられた定義のクラスは、定義された名前が関数本体内またはデータ コンストラクターへの引数としてのみ発生する定義で構成されます。

名前は関数の引数として表示されますが、これはサポートされていません。

その理由は、そうでなければセマンティクスを割り当てることができないためだと思います。あなたが見ている無限の計算は、一般的に避けることが不可能であるように私には思えます。

于 2014-10-24T20:30:55.947 に答える