2017-09-01 8 views
0

は、ここに私のコードですこのエラーは何を意味し、どのように修正するのですか?

let rec Interest a b c = 
    if (c=0) then b else Interest(a ((1.0+a)*b) (c-1));; 

エラーは次のとおりです。

場合(C = 0)、次にB他のインタレスト(((1.0 + A)* B)(C-1)); ;

------------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^

stdin(2,26):エラーFS0001:タイプの不一致。 期待 'は与えられた ' - > int型 - > 'A 'を 'と'' 統一すると、得られるタイプは無限だろう' - > int型 - > '' >

+0

[F#型の不一致が関数を呼び出すときに重複する可能性があります](https://stackoverflow.com/questions/32236509/f-type-mismatch-while-calling-function) – scrwtp

答えて

5

をあなたは3つの引数を取る関数としてInterestを定義しましたが、あなたが渡したものはその引数と一致しません。書かれている方法では、Interestへの再帰呼び出しに単一の引数を渡すだけです - 括弧で囲まれた式​​。ここで、aは、2つの引数、すなわち((1.0=a)*b)(c-1)の関数であると推定されます。

短いストーリーでは、タイプ推論アルゴリズムをオフにして、Interestに与えるタイプのハングアップを得ることができないと断念します。何をしたい

はこれです:

let rec Interest a b c = 
    if (c=0) then b else Interest a ((1.0=a)*b) (c-1) 

あなたは(1.0=a)に問題もあるでしょう。これは、後でbを乗算するブール値に評価されます。意図が何であるか分かりませんが、(if 1.0 = a then 1 else 0)のようなものを探しているかもしれませんか?

"bool"とintsの間の暗黙的な変換をサポートするC言語のように、F#ではすべての変換を明示的にする必要があります(これは数値型間の変換にも適用されます)。

+1

タプルではありません。コンマはありません。それは2つの議論の関数として 'a'を扱っていました。 –

+0

ありがとうございます、あなたはもちろん正しいです。 – scrwtp

+0

ありがとう、3つの引数の周りにかっこを入れることは問題を引き起こしましたが、引数のまわりにカッコを入れる方法はありません...重複して3つの引数が渡されていますか? P.S.編集しました(1.0 = a)..それはタイプミスでした – greg

関連する問題