函数返回元组并将结果分配给新变量

时间:2019-08-27 19:35:56

标签: f#

我最近才刚开始学习F#。我有一个函数,它基于两个点y = ax + bP1(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(...);

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您正在犯一些语法错误。

首先,左箭头运算符<-破坏性更新。它在右侧带有可变变量,在左侧带有表达式,然后将表达式的值压入该变量。例如:

let mutable x = 5
x <- 42

在您的示例中,ab都不是在尝试使用<-运算符时存在的可变变量。另外,操作员希望使用单个可变变量,而不是模式。

第二,在F#中声明新变量的方法是使用let。它可以大致等同于C#中的var,但可以通过将它们放入模式中一次声明多个变量。例如:

let x = 42
let pair = (1, 5)
let a, b = pair

在最后一行,我通过解构a来声明两个变量bpair

在您的示例中,您尝试引入两个新变量ab,而没有使用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#的教程,示例和其他文章,以使自己熟悉语法,然后再尝试进一步尝试。