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}