带逗号的 F# let 语句的语义
题
我正在学习 F#。我首先查看了 F# 样本 来自微软。
我遇到了这样的说法:
let line1,line2 =
use sr = System.IO.File.OpenText @"test.txt"
let line1 = sr.ReadLine()
let line2 = sr.ReadLine()
(line1,line2)
谁能给我解释一下这个说法吗?
这里定义了什么类型?一个函数?一个元组?
为什么 line1
和 line2
必须在定义内重新定义 line1,line2
(let line1 =
... let line2 =
)?
最后一行是怎么回事 (line1, line2)
这与原始定义的类型有何联系?这是函数返回吗?
“语句”这个词在 F# 中用于定义是否正确?
谢谢。
解决方案
F# 中绑定标识符值的一般形式是
let pattern = expression
在这种情况下, 图案 是“line1,line2”,这是一个 元组 模式,它将期望绑定到值的 2 元组,并将名称“line1”和“line2”分配给这两个值。
这 表达 是接下来的 4 行。该表达式内部有局部变量。它们碰巧也被命名为“line1”和“line2”,但它们可以很容易地被重命名为“x”和“y”或其他任何名称——这些标识符的范围是这个缩进表达式的本地范围。(对于编译器而言,使用与外部作用域中的名称相同的名称这一事实没有任何影响。)
如果表达式是表达式的“返回值”,则最后一行。在这种情况下,它返回值“line1”和“line2”的二元组(或者“x”和“y”,如果为了清楚说明而重命名它们)。顺便说一句,由于这两个值的类型均为“string”,因此返回表达式的类型为“string*string”,它是一个二元组,其中每个值都是字符串。这意味着第一行的原始“line1”和“line2”名称将被推断为“string”类型。
F# 是函数式的,因此在某种意义上“一切都是表达式”并且“没有语句”(只有按顺序求值的表达式序列),但 IMO 可以(ab)使用术语“语句”来描述内部的“let”行,除非你想非常精确。