F#:如何在循环中执行多个语句

时间:2016-10-13 13:42:37

标签: f# functional-programming

我是函数式编程的新手,我一直在尝试在循环中执行这些语句,但它给出了一个错误,说f#中不允许使用制表符。请帮忙。这可能包含更多错误,如果我错了,请纠正我。

open System
let sum:int32=0,sum2:int32=0,sum3:int32=0;
let function1(num:int32) =
for i = 1 to num do
  sum = sum + i
  sum2 = sum2 + (i+1)
  sum3 = sum3 + (i+2)
printfn "%i %i %i" sum sum2 sum3

function(11)

3 个答案:

答案 0 :(得分:1)

首先,您应该阅读基本F# syntax的一些介绍。下面不是非常惯用的F#,函数式编程的一个目标是避免可变变量。

open System
let mutable sum = 0
let mutable sum2 = 0
let mutable sum3 = 0
let function1 num =
    for i = 1 to num do
    sum <- sum + i
    sum2 <- sum2 + (i+1)
    sum3 <- sum3 + (i+2)
    printfn "%i %i %i" sum sum2 sum3

function1 11

你应该多次运行这个功能,看看为什么这不是一个好主意。提示,您至少应该在函数范围内定义可变变量。

修改 这是一个具有各种列表操作功能的版本:

let sumFunc2 num =
    [for i in 1..num -> 
     List.init i (fun x -> x+1)] 
    |> List.map List.sum
    |> List.mapi (fun i x -> [x;x+i+1;x+2+2*i])

sumFunc2 4

答案 1 :(得分:1)

我说错误信息不言自明:不要使用标签,使用空格。

除此之外(并且您不能像使用逗号那样使用逗号分隔绑定),您的代码在语法上看起来是有效的,即在循环中执行多项操作,您可以在同样的水平,和你一样。

从语义上讲,它不会做你想做的事。 =是F#中的相等运算符,而不是赋值。默认情况下,Plus变量是不可变的。要做你想做的事,你需要将变量声明为可变并使用赋值运算符<-

尽管如此,这样做的结果不是函数编程,只是在F#中进行命令式编程。功能方式是使用更高阶函数和/或递归,并且根本不使用可变变量。

答案 2 :(得分:1)

正如其他人已经说过的那样,可变变量在函数式编程/ F#中几乎是差不多的。相反,它只是处理数据序列。

我经常发现WITH DataSource (fieldY, result) AS ( SELECT table_C.fieldY ,dbo.F_Aggregate(x.fieldy) as result FROM table_B INNER JOIN .... INNER JOIN .... INNER JOIN .... .... INNER JOIN table_C on ..... GROUP BY table_C.fieldY ) UPDATE table_A SET fieldX = result FROM table_A A INNER JOIN DataSource DS ON A.[fieldY] = DS.[fieldY] WHERE fieldX <> result 在我将在其他语言(如C ++或C#)中使用迭代的地方非常有用。

对于您的问题,List.fold的简单解决方案可能是:

List.fold

在TripleSum中,最后一个open System let tripleSum n = [1..n] |> List.fold (fun (s1, s2, s3) x -> (s1 + x, s2 + 1 + x, s3 + 2 + x)) (0, 0, 0) [<EntryPoint>] let main argv = let sum1, sum2, sum3 = tripleSum 3 printfn "%d, %d, %d" sum1 sum2 sum3 Console.ReadLine() |> ignore 0 // return an integer exit code 是三个总和的初始种子值,它们总结为列表(0, 0, 0)中每个元素所需的折叠函数(fun (s1, s2, s3) ->...