syntax - 带逗号的 F# let 语句的语义

标签 syntax f# tuples semantics let

我正在学习 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 的定义中重新定义 line1line2 (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/

相关文章:

haskell - '.' 和 '$' 之间的等价

mysql - 问号在 MySQL 中 "WHERE column = ?"的意义是什么?

python - 将混合数据类型的元组列表转换为所有字符串

c++ - 具有元组类型子集相应参数的模板函数

php - 我想理解这段 PHP 代码(来自 Laravel app.php 配置文件)

html - 语法题: What is right to do?

f# - if .. else .. 是一种用 F# 写东西的惯用方式吗?

c# - F# 适用于已经将函数委托(delegate)作为参数的 C# 程序员

f# - FSharp计算表达式: Cannot reference binding value in custom operation

python - 尝试在Python中使用cursor.executemany(string, tuple)时引发SQLite操作错误