我是函数式编程的新手,我一直在尝试在循环中执行这些语句,但它给出了一个错误,说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)
答案 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) ->...