5

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

我遇到了这个声明:

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

谁能向我解释这个说法?

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

为什么必须在( ... ) 的定义line1中重新定义?line2line1,line2let line1 =let line2 =

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

“声明”甚至是用于 F# 定义的正确词吗?

谢谢。

4

1 回答 1

15

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

let pattern = expression

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

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

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

F# is functional, and so in a sense "everything is an expression" and "there are no statements" (only sequences of expressions that are sequentially evaluated), but it is ok IMO to (ab)use the term "statement" to describe the inner "let" lines, unless you're trying to be very precise.

于 2009-05-13T16:41:58.933 回答