3

私は F# に関しては非常に緑色で、再帰関数を扱う小さな問題に出くわしました。

次の偶数を吐き出すことになっている関数があります。

let rec nextEven(x) =
    let y = x + 1
    if y % 2 = 0 then y
    else nextEven y


// This never returns..
nextEven 3;;

再帰的になるように「rec」キーワードを使用しますが、使用すると、何らかの理由で無限ループで実行されます。関数を次のように書き直すと:

let nextEven(x) =
    let y = x + 1
    if y % 2 = 0 then y
    else nextEven y

その後、すべて正常に動作します (rec キーワードなし)。関数が再帰的であるため、何らかの理由で「rec」が必要でしたが(なぜそうしないのですか?)、関数の最初のバージョンが永遠に実行されるのはなぜですか?

編集
これはまったくの初心者の間違いであることが判明しました。コメントと回答で説明されているように、途中で関数の複数の定義を作成しました。

4

1 に答える 1

5

の複数の定義があると思われますnextEven。これが、2 番目のコンパイル例の唯一の説明です。再現:

module A =
  let rec nextEven(x) =
    let y = x + 1
    if y % 2 = 0 then y
    else nextEven y

open A //the function below will not compile without this

let nextEven(x) =
    let y = x + 1
    if y % 2 = 0 then y
    else nextEven y //calling A.nextEven

FSI セッションをリセットしてみてください。

于 2013-04-02T19:13:56.647 に答える