我正在学习F#。我首先查看了Microsoft的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 =let line2 =

最后一行(line1, line2)是什么,它如何与原始定义的类型联系在一起?这是函数返回吗?

“语句”甚至是在F#中用于定义的正确单词吗?

谢谢。

最佳答案

F#中绑定(bind)标识符值的一般形式为

let pattern = expression

在这种情况下,模式是“line1,line2”,这是一个元组模式,它将期望绑定(bind)到值的2元组,并为这两个值分配名称“line1”和“line2”。

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

如果表达式是表达式的“返回值”,则最后一行。在这种情况下,它返回值“line1”和“line2”的二元组(如果您为了清楚起见将其重命名,则返回“x”和“y”)。顺便提及,由于这两个值的类型均为“字符串”,因此返回表达式的类型为“字符串*字符串”,即每个值均为字符串的2元组。这意味着第一行的原始“line1”和“line2”名称将分别推断为具有“字符串”类型。

F#是有功能的,因此在某种意义上,“一切都是表达式”和“没有语句”(仅顺序地计算表达式序列),但是IMO可以(ab)使用术语“语句”来描述内部的“let”线,除非您要非常精确。

10-08 14:53