我正在学习 F#。我首先查看了 F# 样本 来自微软。

我遇到了这样的说法:

let line1,line2 = 
    use sr = System.IO.File.OpenText @"test.txt"
    let line1 = sr.ReadLine() 
    let line2 = sr.ReadLine() 
    (line1,line2)

谁能给我解释一下这个说法吗?

这里定义了什么类型?一个函数?一个元组?

为什么 line1line2 必须在定义内重新定义 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”行,除非你想非常精确。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top