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# - Fatal编程技术网

F# 活动模式的要点是什么?

F# 活动模式的要点是什么?,f#,F#,当我们使用模式匹配一个值时,会隐式调用一个“convert”函数。因此,与其写: match value with | Tag1 -> ... | Tag2 -> ... 我可以明确地写: match convert value with | Tag1 -> ... | Tag2 -> ... 这样,我就不必在这里使用活动模式。当然,我必须显式调用convert函数,并且必须显式声明联合类型。但这些对我来说都是小事 那么,活动模式的要点是什么呢?模式匹配的主要功能不是

当我们使用模式匹配一个值时,会隐式调用一个“convert”函数。因此,与其写:

match value with
| Tag1 -> ...
| Tag2 -> ...
我可以明确地写:

match convert value with
| Tag1 -> ...
| Tag2 -> ...
这样,我就不必在这里使用活动模式。当然,我必须显式调用
convert
函数,并且必须显式声明联合类型。但这些对我来说都是小事


那么,活动模式的要点是什么呢?

模式匹配的主要功能不是有趣的语法。模式的主要功能是它们可以嵌套

看看这个:

match value with
| Foo (Bar, Baz [First 42; Second "hello!"]) -> "It's a thing"
| Qux [42; 42; 42] -> "Triple fourty-two"
| _ -> "No idea"
假设所有大写的单词都是活动模式,让我们尝试重写第一个模式,明确调用
convert

match convertFoo value with
| Foo (x, y) -> 
    match convertBar x, convertBaz y with
    | (Bar, Baz [z1; z2]) ->
        match convertFirst z1, convertSecond z2 with
        | First 42, Second "hello!" -> "It's a thing"
太长太复杂?但是等等,我们甚至没有写出所有不匹配的分支

match convertFoo value with
| Foo (x, y) -> 
    match convertBar x, convertBaz y with
    | (Bar, Baz [z1; z2]) ->
        match convertFirst z1, convertSecond z2 with
        | First 42, Second "hello!" -> "It's a thing"
        | _ -> "No idea"
    | _ -> "No idea"
| Qux [42; 42; 42] -> "Triple fourty-two"
| _ -> "No idea"
看看“不知道”分支是如何三倍的?复制粘贴不是很好吗?:-)


顺便说一句,这就是为什么C#胆大包天地试图称之为“模式匹配”的微弱尝试并不是真正的模式匹配:它不能嵌套,因此,正如您非常敏锐地观察到的,它并不比调用分类器函数更好