我正在学习 F#。我首先查看 F# samples来自微软。
我遇到了这样的说法:
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 =
... 让 line2 =
)?
最后一行 (line1, line2)
是什么?它如何与原始定义的类型联系起来?这是函数返回吗?
“语句”这个词在 F# 中用于定义是否正确?
谢谢。
最佳答案
F# 中绑定(bind)标识符值的一般形式是
let pattern = expression
在本例中,模式是“line1,line2”,这是一个元组模式,它将期望绑定(bind)到值的2元组并分配将名称“line1”和“line2”分配给这两个值。
表达式是接下来的 4 行。该表达式内部有局部变量。它们碰巧也被命名为“line1”和“line2”,但它们可以很容易地被重命名为“x”和“y”或其他任何名称——这些标识符的范围是这个缩进表达式的本地范围。 (对于编译器而言,使用与外部作用域中的名称相同的名称这一事实没有任何影响。)
如果表达式是表达式的“返回值”,则为最后一行。在这种情况下,它返回值“line1”和“line2”的二元组(或者“x”和“y”,如果为了清楚说明而重命名它们)。顺便说一句,由于这两个值的类型均为“string”,因此返回表达式的类型为“string*string”,这是一个二元组,其中每个值都是字符串。这意味着第一行的原始“line1”和“line2”名称将被推断为“string”类型。
F# 是函数式的,因此在某种意义上“一切都是表达式”并且“没有语句”(只有按顺序求值的表达式序列),但 IMO 可以(ab)使用术语“语句” ” 来描述内部的“let”行,除非您想非常精确。
关于syntax - 带逗号的 F# let 语句的语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/858941/