代码之家  ›  专栏  ›  技术社区  ›  Josh G

带逗号的F#let语句的语义

  •  3
  • Josh G  · 技术社区  · 17 年前

    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) 这与原始定义的类型有什么关系?这是函数返回吗?

    谢谢

    1 回复  |  直到 17 年前
        1
  •  15
  •   Brian    17 年前

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

    let pattern = expression
    

    在这种情况下 图案 元组 模式中,它希望绑定到一个2元组的值,并为这两个值指定名称“line1”和“line2”。

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

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

    F#是函数式的,因此在某种意义上“一切都是一个表达式”和“没有语句”(只有按顺序求值的表达式序列),但在我看来,(ab)使用术语“语句”来描述内部的“let”行是可以的,除非你试图非常精确。