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
F# 我不知道';我不理解关于F中模式匹配的教程中的一章#_F# - Fatal编程技术网

F# 我不知道';我不理解关于F中模式匹配的教程中的一章#

F# 我不知道';我不理解关于F中模式匹配的教程中的一章#,f#,F#,在下页: 下面是一个例子: type Name = {first:string; last:string} // define a new type let bob = {first="bob"; last="smith"} // define a value // single parameter style let f1 name = // pass in single parameter let {first=f; last=l} =

在下页:

下面是一个例子:

type Name = {first:string; last:string} // define a new type
let bob = {first="bob"; last="smith"}   // define a value

// single parameter style
let f1 name =                       // pass in single parameter
   let {first=f; last=l} = name     // extract in body of function
   printfn "first=%s; last=%s" f l
我不明白这句话:

let {first=f; last=l} = name
我可以理解:

{f=first; l=last}
它会将第一个字段分配给f,最后一个字段分配给l,但我不理解first=f的顺序


这是如何工作的?

这个想法是语法总是
{fieldName=something}
。创建记录时,
something
是分配给此字段的值。当您进行模式匹配时,
某物
是绑定字段值的变量。

从您的问题中,我认为您理解/同意声明记录值的方式:

好的,我们走吧

let绑定中的左侧部分(let xxx=yyy中的
xxx
)实际上是一种模式,而不是语句或赋值。您可以粗略地将模式看作正则表达式,在其中可以定义模式中的一些占位符

一般来说,值的模式应该与值的声明形式相同(示例中的
yyy
)。让我们来写这篇文章,您将看到为什么语法有意义:

let {first=f; last=l} = {first="bob"; last="smith"}
这里,
f
l
是占位符,在绑定之后,
f
的值将是
“bob”
l
的值将是
“smith”

我能理解:
{f=first;l=last}
它将第一个字段分配给f,最后一个字段分配给l

模式可以嵌套,因此当您在
f
和/或
l
上继续模式匹配时,您的解释将中断。例如:

{(Something ff)=first; (Something ll)=last}

简而言之,这里的“赋值”是指将值填充到占位符中,而不是传统语言中的赋值操作(
=
)。

为了支持您的答案,我认为语法总是这样的原因是,F#编译器可以轻松地确定您使用的是哪种类型的记录。此外,由于在F#中,“=”更像是一个等价运算符(即,这两个东西具有相同的值),而不是赋值运算符,因此与传统的命令式语言相比,使用=这种方式更有意义;正确吗?正确,但更正确的是,如果我们不称之为“变量”,我们应该称之为“名称”,因为术语“变量”意味着可变状态;我必须习惯这一点。我用VHDL写了几年,在作业方面我发现了一些相似之处;当时,我花了一段时间才把自己的头绕到它身上,看起来我必须经历类似于F的经历:)
{(Something ff)=first; (Something ll)=last}