2017-03-28 3 views
5

私はF#でTaylorシリーズを書こうとしています。 は私が浮かぶようにint型fact nをキャストしようとしていた最後の行で私のコードTaylor series via F#

let rec iter a b f i = 
    if a > b then i; 
    else f a (iter (a+1) b f i) 
let sum a b = iter a b (+) 0 // from 0 
// e^x = 1 + x + (x^2)/2 + ... (x^n)/n! + ... 
let fact n = iter 1 n (*) 1 // factorial 
let pow x n = iter 1 n (fun n acc -> acc * x) 1 
let exp x = 
      iter 0 x 
       (fun n acc -> 
        acc + (pow x n)/float (fact n)) 0 

を見てみましたが、このコードはコンパイル可能ではないので、私が間違っているよう:( は、私は右のアルゴリズムをやっているようです?

は私が機能-最初に私のコードを呼び出すことができます

+2

Fyodorさんのコメント「*なぜこのコードは動作しないのですか?または同様の質問。それは、答えを書くことから推測の多くを削除し、より多くの人々が推測することなくそれを把握することができるため、あなたがあなたの質問に良い答えを得る可能性が高いことを確認します。 – rmunn

+0

@rmunnあなたのコメントありがとう! 次回は正確なエラーメッセージ、私の悪いことに言及します。 –

答えて

6

コードはコンパイルされませんので:?あなたはINTEGを分割しようとしている

  • pow x nをフロートで置き換えます。除算は同じ型のオペランドを持つ必要があります。
  • 誤ったタイプの端末ケースを指定しています。リテラル0は整数です。

    let exp x = 
         iter 0 x 
          (fun n acc -> 
           acc + float (pow x n)/float (fact n)) 0. 
    

    P.S.:あなたがゼロをフロートしたい場合は、これを試してみてください0.0または略し0.

を使用将来的には、正確なエラーメッセージや予期しない結果を提供してください。単に「うまくいきません」と言っても問題はよく分かりません。

+0

あなたは素晴らしいです! 何らかの理由で、私はあなたの式にfloat要素が1つだけ必要であり、F#がresult floatを作ると思っていました。 私の問題は解決しました。私は自分のコードと一緒に行くのが良いです! TY –

+1

「何らかの理由」はおそらく、自動タイプの拡大が標準であるC言語の過去の経験です。 –

+1

私の答えが助けになった場合は、左側の灰色のチェックマークをクリックして「受け入れ済み」とマークしてください。 –