Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Syntax 带逗号的F#let语句的语义_Syntax_F#_Tuples_Semantics_Let - Fatal编程技术网

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

Syntax 带逗号的F#let语句的语义,syntax,f#,tuples,semantics,let,Syntax,F#,Tuples,Semantics,Let,我在学法语。我首先查看了微软提供的 我无意中发现了这句话: 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

我在学法语。我首先查看了微软提供的

我无意中发现了这句话:

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=

最后一行是什么?
(第1行,第2行)
,这与原始定义的类型有什么关系?这是函数返回吗

在F#中,“statement”是用来定义的正确词吗


谢谢。

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

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

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

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


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

很好的解释!但是在调用代码中如何使用此模式?您是否可以简单地将其命名为其他名称,例如[code]让getStringTuple=…[/code]?奇怪的问题。我还不知道F#,但似乎很清楚没有定义类型——line1和line1是在生成元组的表达式中计算的给定值。询问“重新定义”第1行和第2行是很奇怪的,因为它们在不同的范围内。它与
x=foo()没有区别其中foo有一个名为x的局部变量。。。相同的名称,但完全不同的变量/插槽/对象/实例/whathaveyou。
let pattern = expression