我不了解有关F#模式匹配的教程的一章

时间:2019-06-11 23:43:04

标签: f#

在下一页上:https://fsharpforfunandprofit.com/posts/defining-functions/

有以下示例:

 $(function(){

    $.ajax({
        type: "POST",
        url: "/Group/FillMembers",           
        success: function (response) {
            $.each(response.message, function (key, value) {
                var arr = value.split(";")
                var tbody = $("#tbody");
                var tr = $("<tr></tr>")
                $.each(arr, function (i, obj) {
                    var temp = arr[i].trim().split("=")[1];
                    var td = $("<td></td>")
                    td.append(temp);
                    tr.append(td);
                })
                tbody.append(tr);

            });            
        }
    });      
})

我对以下内容不理解:

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

它将 first 字段分配给 f 并将 last 字段分配给 l 的地方,但是我不知道不了解订单 first = f

这是如何工作的?

2 个答案:

答案 0 :(得分:4)

想法是语法始终为{ fieldName = something }。创建记录时,something是您要分配给该字段的值。模式匹配时,something是将字段值绑定到的变量。

答案 1 :(得分:4)

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

let bob = {first="bob"; last="smith"}   // define a value

好,走吧!

let绑定的左侧部分(xxx中的let xxx = yyy)实际上是 pattern ,而不是语句或赋值。您可以粗略地想到一个类似于正则表达式的模式,您可以在该模式中定义一些占位符。

按常识,值的模式应与值的声明(示例中的yyy)具有相同的形式。让我们写这个,你会明白为什么语法有意义:

let {first=f; last=l} = {first="bob"; last="smith"}

此处fl是占位符,在此绑定之后,f的值将为"bob"l的值将为{{1 }}。

  

我能理解:"smith"会将第一个字段分配给f,最后一个字段分配给l的地方。

模式可以嵌套,因此当您继续在{f=first; l=last}和/或f上进行模式匹配时,您的解释将被打乱。例如:

l

简而言之,您应该在此处将“值”填入占位符,而不是传统语言中的赋值操作({(Something ff)=first; (Something ll)=last} )。