如何理解特定的F#语法

如何理解特定的F#语法,f#,arguments,let,F#,Arguments,Let,在本声明末尾: let (a,b,c) = (1,2,3) in printfn "%i,%i" a b;; ,有 a b;; 结尾“a”和“b”的用法是什么?它们是某个函数调用的参数,还是前一个函数的返回值(元组)?如果是这样,let(a,b,c)的用法是什么,我想它应该定义一个由3个元素组成的元组,但是printfn在语句中做什么呢 换句话说,如何将这个复杂的语句拆分为几个更容易理解的较短语句?我不会放弃“让…进来”的语义学。有什么解释吗 谢谢。让(a,b,c)=(1,2,3)进入…的意

在本声明末尾:

let (a,b,c) = (1,2,3) in printfn "%i,%i" a b;;
,有

a b;;
结尾“a”和“b”的用法是什么?它们是某个函数调用的参数,还是前一个函数的返回值(元组)?如果是这样,let(a,b,c)的用法是什么,我想它应该定义一个由3个元素组成的元组,但是printfn在语句中做什么呢

换句话说,如何将这个复杂的语句拆分为几个更容易理解的较短语句?我不会放弃“让…进来”的语义学。有什么解释吗

谢谢。

让(a,b,c)=(1,2,3)进入…
的意思是:在
里面,
a
应该有值
1
b
应该有值
2
c
应该有
3
(这些绑定将只存在于
..
主体内部-这都是一个表达式-结果将是
..
的任何结果)

为此,元组
(1,2,3)
被分解为
(a,b,c)

现在,
printfn“%i,%i”a b
-
printfn“%i,%i”
被编译成一个函数,它接受两个整数(以货币形式)并打印出来(它们之间有一个

正如您所见,您使用参数
a
b
调用此函数(记住上面的那些值)

总的来说,您将打印出
1,2

忽略了
c
get`s,因此另一种编写方法是

let (a,b,_) = (1,2,3) in printfn "%i,%i" a b

关键字中的
将中间绑定组合到一个表达式中,而不是使用命令式的不同语句序列。OCAML(F#从中派生)在许多情况下需要这种面向表达式的语法。F#允许更面向语句的结构

您可以将其视为用英语描述您的课程的不同(但等效)方式之间的差异:

  • “在下面的示例中,让a=1和b=2:将‘a,b’打印到控制台”(表达式样式-中间绑定只是“前导”到最终的表达式体)
  • “将a设置为1。然后将b设置为2。然后将“a,b”打印到控制台。”(语句样式-每个步骤都是不同的,并且没有太多的意义将所有步骤组合在一起)
后一个短语对应于以下代码,其作用与原始代码相同:

let a = 1
let b = 2
printfn "%i,%i" a b

[注意-Carsten的答案非常好,因为解构和未使用的
c
,所以我只关注
中的
。]

a和b是printf的参数