我最近才刚开始学习F#。我有一个函数,它基于两个点y = ax + b
,P1(x1, y1)
的坐标来计算线性方程P2(x1, y2)
的系数。该函数如下所示:
module LinearFit
let generate(x1 : double, y1 : double, x2 : double, y2 : double) =
let w = x1 * 1.0 - x2 * 1.0
let wa = y1 * 1.0 - y2 * 1.0
let wb = x1 * y2 - x2 * y1
printfn "w: %g" w
printfn "wa: %g" wa
printfn "wb: %g" wb
let a = wa/w
let b = wb/w
printfn "a: %g" a
printfn "b: %g" b
printfn "%g %g" a b
(a, b)
我试图以某种方式将已建立的系数作为元组结果返回,然后将结果分配给新变量,以便以后可以使用该结果执行其他一些操作。到目前为止,琐碎的事情只会显示如下结果:
The generated function is y = 2.5x - 6.5
到目前为止,我一直在尝试做这样的事情
open System
let main() =
printf "Linear fit"
(a: double, b: double) <- LinearFit.generate(5.0, 6.0, 7.0, 11.0)
printfn "The generated functi..."
main()
Console.ReadKey() |> ignore
这只是一个概念,因为我在遇到错误时甚至无法编译项目:
"Unexpected symbol ',' in expression"
"Unexpected symbol ')' in binding."
我试图找到一些与C#类似的方法...
现在,我要实现的只是将generate
函数的结果赋给某些变量。在C#中,它看起来就像
public (double a, double b) Generate(some params here)
{
// some logic here
return (a, b);
}
(var a, var b) = Generate(...);
有什么想法吗?
答案 0 :(得分:2)
您正在犯一些语法错误。
首先,左箭头运算符<-
是破坏性更新。它在右侧带有可变变量,在左侧带有表达式,然后将表达式的值压入该变量。例如:
let mutable x = 5
x <- 42
在您的示例中,a
和b
都不是在尝试使用<-
运算符时存在的可变变量。另外,操作员希望使用单个可变变量,而不是模式。
第二,在F#中声明新变量的方法是使用let
。它可以大致等同于C#中的var
,但可以通过将它们放入模式中一次声明多个变量。例如:
let x = 42
let pair = (1, 5)
let a, b = pair
在最后一行,我通过解构a
来声明两个变量b
和pair
。
在您的示例中,您尝试引入两个新变量a
和b
,而没有使用let
关键字。这是不允许的。
因此,将以上所有内容放在一起,这是完成您要执行的操作的正确方法:
let main() =
printf "Linear fit"
let a, b = LinearFit.generate(5.0, 6.0, 7.0, 11.0)
printfn "The generated functi..."
P.S。您的问题出了误解一些F#语法的基本原理。因此,我建议您通读F#的教程,示例和其他文章,以使自己熟悉语法,然后再尝试进一步尝试。