当我们使用Active Patterns对值进行模式匹配时,将隐式调用一个“转换”函数。所以不用写:
match value with
| Tag1 -> ...
| Tag2 -> ...
Run Code Online (Sandbox Code Playgroud)
我可以明确地写:
match convert value with
| Tag1 -> ...
| Tag2 -> ...
Run Code Online (Sandbox Code Playgroud)
这样,我不必在这里使用活动模式。当然,我必须显式调用该convert函数,并且必须显式声明一个联合类型。但这对我来说是次要的事情。
那么活动模式的重点是什么?
Fyo*_*kin 14
模式匹配的主要功能不是有趣的语法。模式的主要功能是可以嵌套。
看看这个:
match value with
| Foo (Bar, Baz [First 42; Second "hello!"]) -> "It's a thing"
| Qux [42; 42; 42] -> "Triple fourty-two"
| _ -> "No idea"
Run Code Online (Sandbox Code Playgroud)
假定所有大写单词都是活动模式,让我们尝试通过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"
Run Code Online (Sandbox Code Playgroud)
太长且令人费解?但是,等等,我们甚至还没有编写所有不匹配的分支!
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"
Run Code Online (Sandbox Code Playgroud)
看看“ No idea”分支是如何重复的?复制粘贴不是很好吗?:-)
顺便说一句,这就是为什么C#胆怯地尝试他们大胆地称其为“模式匹配”并不是真正的模式匹配:它不能嵌套,因此,正如您非常敏锐地观察到的那样,它不仅仅只是调用分类器功能。