使用逗号的F#let语句的语义

Jos*_*h G 5 syntax f# tuples let semantics

我正在学习F#.我首先查看了Microsoft 的F#示例.

我跑过这个声明:

let line1,line2 = 
    use sr = System.IO.File.OpenText @"test.txt"
    let line1 = sr.ReadLine() 
    let line2 = sr.ReadLine() 
    (line1,line2)
Run Code Online (Sandbox Code Playgroud)

谁能向我解释这个陈述?

这里定义的是什么类型?一个功能?一个元组?

为什么line1line2必须的定义范围内重新定义line1,line2(let line1 =... let line2 =)?

什么是最后一行,(line1, line2)这与原始定义的类型有什么关系?这是函数返回吗?

"声明"甚至是用于F#中定义的正确单词吗?

谢谢.

Bri*_*ian 14

F#中绑定标识符值的一般形式是

let pattern = expression
Run Code Online (Sandbox Code Playgroud)

在这种情况下,模式是"line1,line2",它是一个元组模式,它期望绑定到2元组的值,并将名称"line1"和"line2"分配给这两个值.

表达是在接下来的4行.在该表达式中有局部变量.它们碰巧也被命名为"line1"和"line2",但它们很容易被重命名为"x"和"y"或其他 - 这些标识符的范围是这个缩进表达式的本地.(就编译器而言,相同名称用作外部作用域中的名称这一事实无效.)

如果表达式是表达式的"返回值",则为最后一行.在这种情况下,它返回值为"line1"和"line2"的2元组(或"x"和"y",如果为了清晰的说明而重命名它们).顺便说一下,由于这两个值都有类型"string",因此返回表达式的类型是"string*string",它是一个2元组,其中每个值都是一个字符串.这意味着第一行上的原始"line1"和"line2"名称将被推断为具有类型"string".

F#是功能性的,因此从某种意义上说"一切都是表达"和"没有语句"(只有顺序评估的表达式序列),但IMO(ab)使用术语"语句"来描述是可以的内在的"让"线,除非你想要非常精确.