FSharp参数模式匹配。为什么要分配声明而不是?

时间:2015-06-27 10:05:19

标签: f# pattern-matching

我在看FSharp。 目前我正在阅读这个资源: http://fsharpforfunandprofit.com/

由于我正在学习一些全新的东西,包括一种新的思维方式,我很谨慎,只是让那些对我来说毫无意义的东西滑落。

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

为什么“f”和“l”位于各自“=”符号的右侧侧?这不是他们宣布的地方吗?我相信我知道该行的 (它从“name”记录中提取“first”和“last”属性)。但我无法理解这种语法选择背后的原因,这使我怀疑我并不真正了解这里发生的事情的全部内容。

1 个答案:

答案 0 :(得分:2)

let=之间的语法部分称为 pattern 。正如评论中所提到的,该模式反映了您在创建记录时使用的语法。

更一般地说,模式的想法是你指定你知道的对象的一部分(这里是记录字段名称)和变化的地方(字段的值),你可以放一个变量名(在这种情况下,模式匹配绑定变量)或者您可以编写_来忽略对象该部分的值。

以下是创建值的一些示例:

let opt = Some(42)                              // Option type containing int
let rcd = { First = "Tomas"; Last = "Hidden" }  // Record from your example
let tup = 42, "Hello"                           // Tuple with int and string

在所有情况下,您都可以在模式中镜像语法:

let (Some(num)) = opt         // This gives warning, because 'opt' could also be None
let { First = n; Last = _ }   // Here, we explicitly ignore the last name using '_'
let _, str = tup              // Ignore first component of the tuple, but get the 2nd