我只是对Haskell中模式匹配的效率感到好奇。什么是模式匹配优于嵌套if
/ case
语句然后相反的简单情况?
感谢您的帮助。
答案 0 :(得分:20)
在Haskell中,case
和模式匹配是密不可分的;你不能没有另一个。 if p then e1 else e2
是case p of { True -> e1; False -> e2 }
的语法糖。由于这些原因,我认为不可能制作出你要求的例子;在Core Haskell中,一切都等同于case
。
在ML系列的语言中,优化器通常可以通过复杂的模式匹配来完成非常令人印象深刻的事情。这对Haskell编译器来说更难;由于延迟评估,模式匹配编译器不允许重新排序某些测试。换句话说,如果以不同的方式嵌套case
语句,则可能会获得不同的性能,但在Haskell中,您也会获得不同的语义。所以通常编译器不会搞乱它。
就编写自己的代码的方式而言,可以安全地假设具有最少案例表达式的代码是最好的(请记住,一个if
等同于一个案例表达式)。
答案 1 :(得分:7)
我没有证实这一点,但我认为两种形式在编译器转换为核心Haskell时将成为嵌套的表达式。找出答案的最好方法是询问编译器本身。在GHC中,您可以使用以下参数打开核心中间程序的转储:
答案 2 :(得分:5)
根据规范,它们是semantically equivalent。当然,这并不一定意味着它们的实现方式相同,但如果体面的编译器存在差异,我个人会感到惊讶。