F# 活动模式的要点是什么?
当我们使用模式匹配一个值时,会隐式调用一个“convert”函数。因此,与其写:F# 活动模式的要点是什么?,f#,F#,当我们使用模式匹配一个值时,会隐式调用一个“convert”函数。因此,与其写: match value with | Tag1 -> ... | Tag2 -> ... 我可以明确地写: match convert value with | Tag1 -> ... | Tag2 -> ... 这样,我就不必在这里使用活动模式。当然,我必须显式调用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#胆大包天地试图称之为“模式匹配”的微弱尝试并不是真正的模式匹配:它不能嵌套,因此,正如您非常敏锐地观察到的,它并不比调用分类器函数更好