我正在学习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”线,除非您要非常精确。