11

我只是对 Haskell 中模式匹配的效率感到好奇。什么是模式匹配比嵌套if/case语句更好的简单情况,然后反过来呢?

谢谢你的帮助。

4

3 回答 3

20

在 Haskell 中,case和模式匹配有着千丝万缕的联系;你不能没有另一个。 if p then e1 else e2是 . 的语法糖case p of { True -> e1; False -> e2 }。由于这些原因,我认为不可能产生您要求的示例;在 Core Haskell 中,一切都等同于case.

在 ML 系列的语言中,优化器通常可以通过复杂的模式匹配来完成令人印象深刻的事情。这对 Haskell 编译器来说更难;由于惰性评估,模式匹配编译器不允许重新排序某些测试。换句话说,如果你case以不同的方式嵌套语句,你可能会得到不同的性能,但在 Haskell 中你也会得到不同的语义。所以通常编译器不会弄乱它。

至于编写自己的代码的方式,可以肯定地假设具有最少 case 表达式的代码是最好的(请记住,一个if等于一个 case 表达式)。

于 2009-01-09T05:31:26.853 回答
7

我没有确认这一点,但我认为当编译器将这两种形式翻译成核心 Haskell 时,这两种形式都会成为一个嵌套的 case-of 表达式。找出答案的最好方法是询问编译器本身。在 GHC 中,您可以使用以下参数打开核心中间程序的转储:

  • 简化前:-ddump-ds
  • 简化后:-ddump-simpl
于 2009-01-09T03:48:52.410 回答
5

根据规范,它们在语义上是等价的。当然,这并不一定意味着它们的实现方式相同,但如果一个体面的编译器存在差异,我个人会感到惊讶。

于 2009-01-11T22:55:02.493 回答