2011-10-27 16 views
1

私はF#インタラクティブで次のコードを試していますが、エラー 'FS0001'が発生します。 'int - > int'型が 'int'型と一致しません。ここでは、私が試しているコードは関数呼び出しがエラーを返すのはなぜですか?

> let rec factorial n = function 
    | 0 -> 1 
    | n -> n * factorial (n - 1);; 

これは 'F3の科学者の本の例ではありません。 ありがとう、

答えて

3

あなたが定義したように、factorialは2つの引数をとりますが、1つしか渡していません。その結果、関数の2番目の枝は、の部分的に適用された関数でintを乗算しようとしています。

最初の行は

let rec factorial = function 

(サンセリフn)を読んでください。

4

構文の詳細を追加するだけです。functionキーワードは、暗黙のうちに名前を付けずに引数をとり、その値に対してパターンマッチングを行う関数を作成します。

これを行うにはかなりの数の同等の方法があります - 説明ildjarnようfunctionを使用して:

let rec factorial = function 
    | 0 -> 1 
    | n -> n * factorial (n - 1) 

あなたはまたnを取る関数としてfactorialを宣言してからmatchを使用することができます。

let rec factorial n = 
    match n with 
    | 0 -> 1 
    | n -> n * factorial (n - 1) 

また、完全性のために、funを使用して関数を作成することもできます(functionのより単純なバージョンです)パターンマッチングの複数のケースを書き込むために: - 第1)は、任意の正当な理由なしに(わずかに複雑であるので、私は、最初の2つのいずれかの希望

let rec factorial = fun n -> 
    match n with 
    | 0 -> 1 
    | n -> n * factorial (n - 1) 

を最初の2つのオプションは、両方の慣用F#コードであります。

関連する問題