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