在本声明的最后:
let (a,b,c) = (1,2,3) in printfn "%i,%i" a b;;
,有
a b;;
结尾的使用是什么" a"和" b",它们是某些函数调用的参数,或者它们是先前函数的返回值(元组)吗?如果是这样,let(a,b,c)的用法是什么,我想它应该定义一个由3个元素组成的元组,但是printfn在语句中做了什么?
换句话说,如何将这个复杂的语句拆分成几个更容易理解的简短语句?我不会退出"让...进入"语义。有什么解释吗?
谢谢。
答案 0 :(得分:12)
let (a,b,c) = (1,2,3) in ...
表示:里面 ...
a
应该有值1
,b
应该有值2
并且c
应该有3
(而那些绑定只会存在于...
正文中 - 它只是一个表达式 - 结果将是...
的结果{1}}是)
为了做到这一点,元组(1,2,3)
被解构为模式(a,b,c)
现在在...
边printfn "%i,%i" a b
- printfn "%i,%i"
被编译成一个函数,该函数采用两个整数(以咖喱形式)并打印出来(之间有一个,
它们)。
正如您所看到的,您使用参数a
和b
调用此函数(请记住上面的值)。
总体而言,您将打印出1,2
c
被忽略了,所以另一种写作方式是
let (a,b,_) = (1,2,3) in printfn "%i,%i" a b
答案 1 :(得分:1)
in
关键字将中间绑定组合在一起成为单个表达式,而不是更为命令式的不同语句序列。在许多情况下,OCAML(F#派生自此)需要这种面向表达式的语法。 F#允许更加面向语句的结构。
您可以将其视为用英语描述您的计划的这些不同(但相当)的方式之间的区别:
后面的措辞将对应于以下代码,它与原始代码相同:
let a = 1
let b = 2
printfn "%i,%i" a b
[注意 - Carsten的回答非常好,而且未使用c
,所以我只专注于in
]