我一直在试图解释的差异之间的关发言和发表的模式匹配(F#)几个人但我还没有真正能够解释它。。大多数时候他们只是看着我并说"所以你为什么不利用如果..然后..别的"。

你会怎么跟他们解释?

编辑!感谢大家的伟大的答案,我真希望我可能标志着多个正确的答案。

有帮助吗?

解决方案

具有以前一直是"那些人",我不知道,有一个简明扼要的方式总结为什么模式匹配是如此美味的善良。它的经验。

回来时,我刚瞟了一眼模式匹配,并认为这是一个荣耀的开声明,我认为我没有经验的编程代数数据类型(组和工会的歧视),并不相当看到的模式匹配是一个控制构造 结构造。现在,我已经编程F#我终于"获取"。模式匹配的凉意的是,由于一个交汇处的特征中发现的功能的程序语言,所以,这是不平凡的局外人看到赞赏。

我试着总结一个方面为什么模式匹配是有用的,在第二个短短的两个部分的博客系列在语言和API设计;检查了 第一部分第二部分.

其他提示

模式给你一个小的语言来描述你想要的值相匹配的结构。结构可以是任意地深的,并可以绑定变量来结构化值的部件。

这允许你写的东西非常简洁。可以用一个小例子说明这一点,例如一个简单的类型的数学表达式的衍生物功能:

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)));;

此外,因为模式匹配是用于静态类型的静态结构,编译器可以(ⅰ)验证是否覆盖所有的情况(ⅱ)检测冗余分支,可以从未匹配任何值(ⅲ)提供一个非常有效的实现(具有跳等)。

摘录 这个博客的文章:

模式匹配具有若干优势交换的发言和发表的方法调度:

  • 模式匹配可以采取行动整数, 漂浮,弦乐和其他类型 好吧作为对象。
  • 模式匹配可以采取行动的几个 不同价值同时:平行模式匹配。方法 调度和交换机仅限于一个单一的 值,例如"这个"。
  • 模式可以嵌套,允许 派遣了树木的任意 深度。方法的调度和交换是有限的 非嵌套的情况。
  • 或模式,允许子模式以 共享。方法调度只允许 分享当的方法是从 班发生分享基 类。否则你必须手动 因子的共同进入一个 单独的功能(给它一个 名称)和然后手动插入的电话 从所有适当的地方给你 不必要的功能。
  • 模式匹配提供冗余 检查其渔获量错误。
  • 嵌套和/或平行的图案 相匹配的优化用于你的 F#编译器。OO等必须 是手写的不断 通过重新优化手过 发展,这是令人望而却步 繁琐且容易出错所以 生产质量OO码的倾向 以极其缓慢进行比较。
  • 活动模式能让你来注射 定义派遣的语义。

关掉我的头顶:

  1. 编译器可以告诉你,如果你还没有复盖所有的可能性在你的比赛
  2. 你可以使用一个匹配作为分配
  3. 如果你有一个受歧视的联盟,每个匹配可以有不同的"类型"

交换机是两个前轮。

模式匹配是整个车。

元组具有 “” 和变体具有CTOR ARGS ..这些构造函数,它们创建的东西。

模式是析构函数,它们翻录它们分开。

他们是双重概念。

要这种更有力地把:一个元组或变体的概念不能仅通过它的构造进行说明:需要析构函数或所做的值是没用的。它是定义一个值,这些双重的描述。

通常,我们认为作为构造数据,和析构函数作为控制流。变体的析构函数是交替的分支(多个中的一个),元组析构函数是平行的螺纹(所有许多的)。

在并行操作中是显而易见的像

(f * g) . (h * k) = (f . h * g . k) 

,如果你认为流过的功能控制,元组提供一种方法来计算分成控制的并行线程。

在这种方式来看,表达式的方式来构成的元组和变体进行复杂的数据结构(认为一个AST的)。

和模式匹配办法构成析构函数(同样,认为一个AST的)。

模式匹配在OCaml,除了被更多的表现,因为所提到的在几个方面,上文已经描述,也给一些非常重要的静态保证。编译器将被证明对于你的情况分析体现的模式匹配的语句是:

  • 详尽的(没有任何案件被错过)
  • 非多余的(没有情况下永远不能打,因为他们是抢先由以前的情况下)
  • 声音(无模式是不可能给出的数据类型中的问题)

这是一个真正的大问题。这是有时你写的程序的第一次,非常有用的,当你的程序是不断发展。使用正确的、匹配的发言使它更加容易改变中的类型代码可靠,因为系统类型点你在破比赛的发言,这是一个体面的指标,你们的代码需要修复。

如果-ELSE取决于(或开关)语句有关选择不同的方式来处理的值(输入)的属性手边的值的

模式匹配是有关定义如何处理给出的值其结构,(还注意到,单个壳体模式匹配意义)。

因此图案匹配更多关于比作出选择解构值,这使得它们非常方便的机制来定义上电感结构(递归)函数(递归联合类型),这解释了为什么它们在语言,因此大量使用等ocaml的等

PS:你可能知道的模式匹配和的if-else数学从他们的临时使用“模式”;

“如果x具有属性甲那么y否则Z”(如果 - 否则)

“一些术语在p1..pn其中....是x的素数分解..”((单情况)模式匹配)

也许你可以绘制一个字符串和正则表达式的比喻?你描述的什么的你正在寻找,并让编译器弄清楚的如何的本身。它使你的代码更简单,更清晰。

顺便说一句:我发现,关于模式匹配的最有用的事情是,它鼓励良好的生活习惯。我对付极端案例的第一的,而且很容易检查,我已经介绍每一种情况下。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top