我只是对 Haskell 中模式匹配的效率感到好奇。什么是模式匹配比嵌套if
/case
语句更好的简单情况,然后反过来呢?
谢谢你的帮助。
在 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 表达式)。
我没有确认这一点,但我认为当编译器将这两种形式翻译成核心 Haskell 时,这两种形式都会成为一个嵌套的 case-of 表达式。找出答案的最好方法是询问编译器本身。在 GHC 中,您可以使用以下参数打开核心中间程序的转储:
根据规范,它们在语义上是等价的。当然,这并不一定意味着它们的实现方式相同,但如果一个体面的编译器存在差异,我个人会感到惊讶。