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

时间:2012-02-26 07:28:24

标签: 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

我对sqrtIterator的递归调用出错了: 预计此表达式的类型为float,但此处的类型为float -> float

所以看起来我错过了一个参数,让它返回一个带一个参数的函数,但我看不出什么错误?

3 个答案:

答案 0 :(得分: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是一个假设为float的单个参数。

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

答案 1 :(得分:4)

以下是修复的问题:

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

你的父母错了。

答案 2 :(得分:4)

sqrtIterator中的包围稍微偏离 - 您需要

  else sqrtIterator (improve guess x) x