【问题标题】:Semantics of F# let statement with commaF# let 带逗号的语句的语义
【发布时间】:2010-10-25 22:16:47
【问题描述】:

我正在学习 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)

谁能给我解释一下这个说法?

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

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

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

“声明”是否是在 F# 中用于定义的正确词?

谢谢。

【问题讨论】:

  • 奇怪的问题。我还不知道 F#,但似乎很清楚没有定义任何类型—— line1 和 line1 被赋予在产生元组的表达式中计算的值。询问“重新定义” line1 和 line2 很奇怪,因为它们在不同的范围内。这与x = foo(); 没有什么不同,其中 foo 有一个名为 x ... 的局部变量...同名,但变量/插槽/对象/实例/whathaveyou 完全不同。

标签: syntax f# tuples semantics let


【解决方案1】:

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

let pattern = expression

在这种情况下,pattern 是 "line1, line2",这是一个 tuple 模式,它期望绑定到一个 2 元组的值并赋值这两个值的名称“line1”和“line2”。

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

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

F# 是函数式的,因此在某种意义上“一切都是表达式”和“没有语句”(只有按顺序计算的表达式序列),但 IMO 可以(ab)使用术语“语句” " 来描述内部的“让”行,除非您想非常精确。

【讨论】:

  • 很好的解释!但是你将如何在调用代码中使用这种模式呢?您能否轻松地将其命名为其他名称,例如 [code]let getStringTuple = ...[/code] ?
猜你喜欢
  • 2010-10-25
  • 1970-01-01
  • 2023-03-16
  • 2015-02-26
  • 1970-01-01
  • 2021-10-06
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多