2016-11-06 19 views
2

私はF#を初めて使いました。関数rptを実装しようとしていたときにいくつか問題が見つかりました。F#関数の戻り値

私は rpt (fun x -> x*x) 4 2としてこの関数を呼び出した
let rec rpt f n x = 
    if n=0 then x 
    else 
     f (rpt f (n-1) x) 

。答えはval it : int = 65536 OKだった。しかし、以下のように、私は(唯一の2を乗じ)rptを変更する場合:

let rec rpt f n x = 
    if n=0 then 2*x 
    else 
     f (rpt f (n-1) x) 

機能のみゼロを返します:val it : int = 0。誰も何が起こるか説明できますか?

+2

があふれ 'int'戻り値はありますか?他の入力にも使えますか? – Lee

+0

@Leeはい、まったく正しいです、ありがとうございます。私はその明らかな理由を見ていないように機能的なパラダイムを理解することについてとても混乱していました。 – YV17

答えて

4

二乗関数を4回繰り返すと、2^4 = 16の合計パワーが得られます。これは最初の解答 - 65536 = 2^16と完全に一致します。しかし、最初に追加の2次電力を追加すると、16 * 2 = 32の合計電力が得られます。これはまさにintタイプのサイズなので、完全にオーバーフローしてゼロになります。

あなたはint64intを置き換えることによって、これを確認することができます

let rec rpt f n x = 
    if n=0 then 2L*x 
    else 
     f (rpt f (n-1) x) 

> rpt (fun x -> x*x) 4 2L;; 
val it : int64 = 4294967296L 

> pown 2L 32;; 
val it : int64 = 4294967296L