2012-02-26 89 views
2

對不起不會浮在非常糟糕的冠軍,但我不能想出一個更好的...函數返回功能和F#

我下面的結構和計算機程序的解釋,我試圖做關於尋找平方根的Netwon的連續近似方法的第1.1.7節中的例子。

我嘗試實施它在F#中,我相信我敢接近到那裏,但可能有某種語法問題。

這裏是我的代碼(我用linqpad,因此轉儲()),低於如下問題

let square a = a * a 

let average a b = (a + b)/2.0 

let a = average 2.0 1.0 
a.Dump() 

let improve guess x = average guess x 

let i = improve 2.0 1.0 
i.Dump() 

let goodEnough guess x = abs (x - square(guess)) < 0.001 

let g = goodEnough 3.0 4.0 
g.Dump() 

let g2 = goodEnough 2.0 4.0 
g2.Dump() 

let rec sqrtIterator guess x = 
    if goodEnough guess x then guess 
    else sqrtIterator(improve(guess x) x) 

let sqrt x = sqrtIterator 1.0 x 

我的遞歸調用sqrtIterator得到一個錯誤說: 此表達預計將有類型float但這裏有類型float -> float

所以它似乎我缺少一個參數,使其返回一個函數採取一個參數,但我不明白什麼是錯的?

+0

順便說一句我的提高是錯誤的,這是正確的:讓改善猜測X =平均猜想(X /猜測) – khebbie 2012-02-26 17:07:43

回答

5

更改sqrtIterator(improve(guess x) x)sqrtIterator (improve guess x) x可以解決這個問題。

從表達式的第一部分在sqrtIterator

if goodEnough guess x then guess

類型檢查器知道guessfloat因爲goodEnough已有類型float -> float

else分支預期具有類型float爲好。因此,sqrtIterator的類型爲float -> float -> float

但是,您在else分支提供sqrtIterator(improve(guess x) x)。最外面的圓括號表示improve(guess x) x是假設爲float的單個參數。

現在sqrtIterator(improve(guess x) x)返回float -> float因此上述錯誤消息。

4

這裏的問題是固定的:

let rec sqrtIterator guess x = 
    if goodEnough guess x then guess 
    else sqrtIterator (improve guess x) x 

你的括號是錯誤的。

4

你在sqrtIterator包圍稍微偏離 - 你需要

else sqrtIterator (improve guess x) x