如何理解特定的F#语法

时间:2015-05-29 10:44:38

标签: 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在语句中做了什么?

换句话说,如何将这个复杂的语句拆分成几个更容易理解的简短语句?我不会退出"让...进入"语义。有什么解释吗?

谢谢。

2 个答案:

答案 0 :(得分:12)

let (a,b,c) = (1,2,3) in ...表示:里面 ... a应该有值1b应该有值2并且c应该有3(而那些绑定只会存在于...正文中 - 它只是一个表达式 - 结果将是...的结果{1}}是)

为了做到这一点,元组(1,2,3)被解构为模式(a,b,c)

现在在...printfn "%i,%i" a b - printfn "%i,%i"被编译成一个函数,该函数采用两个整数(以咖喱形式)并打印出来(之间有一个,它们)。

正如您所看到的,您使用参数ab调用此函数(请记住上面的值)。

总体而言,您将打印出1,2

c被忽略了,所以另一种写作方式是

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

答案 1 :(得分:1)

in关键字将中间绑定组合在一起成为单个表达式,而不是更为命令式的不同语句序列。在许多情况下,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,所以我只专注于in]