Bru*_*ine 30
模式为您提供了一种小语言来描述您想要匹配的值的结构.结构可以任意深度,您可以将变量绑定到结构化值的某些部分.
这使您可以非常简洁地编写内容.您可以通过一个小例子来说明这一点,例如简单类型的数学表达式的派生函数:
type expr =
| Int of int
| Var of string
| Add of expr * expr
| Mul of expr * expr;;
let rec d(f, x) =
match f with
| Var y when x=y -> Int 1
| Int _ | Var _ -> Int 0
| Add(f, g) -> Add(d(f, x), d(g, x))
| Mul(f, g) -> Add(Mul(f, d(g, x)), Mul(g, d(f, x)));;
Run Code Online (Sandbox Code Playgroud)
另外,因为模式匹配是静态类型的静态构造,所以编译器可以(i)验证您是否覆盖了所有情况(ii)检测永远不能匹配任何值的冗余分支(iii)提供非常有效的实现(具有跳转等). ).
Jon*_*rop 15
摘自此博客文章:
与switch语句和方法分派相比,模式匹配有几个优点:
元组有","和Variants有Ctor args ..这些是构造函数,它们创造了东西.
模式是析构函数,它们将它们分开.
他们是双重概念.
更强有力地说:元组或变体的概念不能仅仅通过它的构造函数来描述:析构函数是必需的,或者你创造的值是无用的.正是这些双重描述定义了一个价值.
通常我们将构造函数视为数据,将析构函数视为控制流.变体析构函数是备用分支(许多中的一个),元组析构函数是并行线程(所有这些都是).
并行性在诸如此类的操作中很明显
(f * g) . (h * k) = (f . h * g . k)
Run Code Online (Sandbox Code Playgroud)
如果你想到控制流经一个函数,元组提供了一种将计算分解为并行控制线程的方法.
以这种方式看,表达式是组合元组和变体以制作复杂数据结构的方法(想想AST).
模式匹配是构成析构函数的方法(再次考虑AST).
| 归档时间: |
|
| 查看次数: |
9845 次 |
| 最近记录: |