F#For循环否定倒计时 - Type int不支持运算符..-

时间:2013-07-30 16:03:37

标签: f#

我试图在非递归因子函数中从6倒数到1并且遇到编译器错误:

let fact x =
    let mutable product = 1
    for i in x..-1..1 do
        product <- product * i
    product

// Error on the 6 - type 'int' does not support the operator '..-'
let answer = fact 6
printfn "%i" answer

我从底部here

附近得到了这个想法

已将功能更改为仅计数并且可以正常工作,但我很想知道为什么会失败。有更好的倒计时方法吗?

使用VS2012更新3

3 个答案:

答案 0 :(得分:17)

  

已将功能更改为仅计数并且有效,但我有兴趣知道为什么会失败。

您的示例失败,因为..-是两个不同的运算符,编译器需要将它们分开。您可以添加空格,而不是用括号括起-1

let fact x =
    let mutable product = 1
    for i in x .. -1 .. 1 do
        product <- product * i
    product
  

有更好的倒数方法吗?

不太知名的for .. downto .. do结构更适合在这里使用。

let fact x =
    let mutable product = 1
    for i = x downto 1 do
        product <- product * i
    product

答案 1 :(得分:8)

这有效:

let fact x =
  let mutable product = 1
  for i in x..(-1)..1 do
    product <- product * i
  product

就像这样(在问题中的链接中使用):

let fact x =
  let mutable product = 1
  for i in x .. -1 .. 1 do
    product <- product * i
  product

PS:还要注意有更多功能方法来计算阶乘(使用可变变量不好);最明显的使用递归:

let rec fact x =
  if x > 2
  then x * (fact (x - 1))
  else x

或使用列表的单行:

let fact x = [2..x] |> List.reduce (*)

答案 2 :(得分:4)

尝试使用括号:

...
for i in x..(-1)..1 do
...