函数返回函数而不是f#中的float

khe*_*bie 2 f# functional-programming

对不起真的糟糕的冠军,但我无法想出一个更好的冠军......

我正在关注计算机程序的结构和解释,并试图从1.1.7节中做一个关于Netwon寻找平方根的连续逼近方法的例子.

我尝试在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
Run Code Online (Sandbox Code Playgroud)

我对sqrtIterator的递归调用收到错误说:这个表达式应该有类型, float 但这里有类型 float -> float.

所以我似乎错过了一个参数,使得它返回一个带一个参数的函数,但我看不出什么错了?

pad*_*pad 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.

但是,您sqrtIterator(improve(guess x) x)else分支机构中提供了.最外面的括号表示这improve(guess x) x是一个假设为a的单个参数float.

现在sqrtIterator(improve(guess x) x)返回float -> float上面的错误消息.