如何理解特定的 F# 语法
How to understand specific F# syntax
在此声明的末尾:
let (a,b,c) = (1,2,3) in printfn "%i,%i" a b;;
,还有
a b;;
"a"和"b"结尾的用法是什么,它们是某个函数调用的参数,还是前一个函数的return值(元组)?如果是这样,let(a,b,c)的用法是什么,我想它应该定义一个3个元素的元组,但是printfn在语句中做了什么?
换句话说,如何将这个复杂的语句拆分成几个更容易理解的较短的语句?我不退出 get "let ... in" 语义。有什么解释吗?
谢谢。
let (a,b,c) = (1,2,3) in ...
表示:里面...
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
被忽略了,所以另一种写法是
let (a,b,_) = (1,2,3) in printfn "%i,%i" a b
in
关键字将中间绑定组合到一个 表达式 中,而不是更命令式的不同 语句序列 。 OCAML(F# 从中派生)在许多情况下需要这种面向表达式的语法。 F# 允许更面向语句的结构。
您可以将其视为这些用英语描述您的程序的不同(但等效)方式之间的区别:
- "In the following, let a = 1 and b = 2: Print 'a,b' to the console"(表达式样式 - 中间绑定只是 "leading up" 到最终表达式主体)
- "Set a to 1. Then set b to 2. Then print 'a,b' to the console."(语句风格——每一步都是不同的,将它们组合在一起的意义不大)
后面的措辞对应于以下代码,其作用与您的原始代码相同:
let a = 1
let b = 2
printfn "%i,%i" a b
[注意 - 关于去元组和未使用的 c
,Carsten 的回答很棒,所以我只关注 in
]
在此声明的末尾:
let (a,b,c) = (1,2,3) in printfn "%i,%i" a b;;
,还有
a b;;
"a"和"b"结尾的用法是什么,它们是某个函数调用的参数,还是前一个函数的return值(元组)?如果是这样,let(a,b,c)的用法是什么,我想它应该定义一个3个元素的元组,但是printfn在语句中做了什么?
换句话说,如何将这个复杂的语句拆分成几个更容易理解的较短的语句?我不退出 get "let ... in" 语义。有什么解释吗?
谢谢。
let (a,b,c) = (1,2,3) in ...
表示:里面...
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
被忽略了,所以另一种写法是
let (a,b,_) = (1,2,3) in printfn "%i,%i" a b
in
关键字将中间绑定组合到一个 表达式 中,而不是更命令式的不同 语句序列 。 OCAML(F# 从中派生)在许多情况下需要这种面向表达式的语法。 F# 允许更面向语句的结构。
您可以将其视为这些用英语描述您的程序的不同(但等效)方式之间的区别:
- "In the following, let a = 1 and b = 2: Print 'a,b' to the console"(表达式样式 - 中间绑定只是 "leading up" 到最终表达式主体)
- "Set a to 1. Then set b to 2. Then print 'a,b' to the console."(语句风格——每一步都是不同的,将它们组合在一起的意义不大)
后面的措辞对应于以下代码,其作用与您的原始代码相同:
let a = 1
let b = 2
printfn "%i,%i" a b
[注意 - 关于去元组和未使用的 c
,Carsten 的回答很棒,所以我只关注 in
]