2012-02-26 60 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