我只是对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中,您也会获得不同的语义.所以通常编译器不会搞乱它.
至于编写自己的代码的方式,可以安全地假设具有最少案例表达式的代码是最好的(请记住,一个if
等同于一个案例表达式).
我没有证实这一点,但我认为这两种形式在编译器转换为核心Haskell时将成为嵌套的表达式.找出答案的最好方法是询问编译器本身.在GHC中,您可以使用以下参数打开核心中间程序的转储:
在简化之前:-ddump-ds
简化后:-ddump-simpl
根据规范,它们在语义上是等价的.当然,这并不一定意味着它们的实现方式相同,但如果一个体面的编译器存在差异,我个人会感到惊讶.