活动模式的重点是什么?

时间:2019-06-11 03:42:13

标签: f#

当我们使用Active Patterns对值进行模式匹配时,将隐式调用一个“转换”函数。所以不用写:

match value with
| Tag1 -> ...
| Tag2 -> ...

我可以明确地写:

match convert value with
| Tag1 -> ...
| Tag2 -> ...

这样,我不必在这里使用活动模式。当然,我必须显式调用convert函数,并且必须显式声明联合类型。但这对我来说是次要的事情。

那么活动模式的重点是什么?

1 个答案:

答案 0 :(得分:14)

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

看看这个:

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"

看看“ No idea”分支是如何重复的?复制粘贴不是很好吗? :-)


顺便说一句,这就是为什么C#胆怯地尝试他们大胆地称其为“模式匹配”并不是真正的模式匹配:它不能嵌套,因此,正如您非常敏锐地观察到的那样,这并没有更好的选择不仅仅是调用分类器函数。