我最近在某处读过模式匹配在运行时发生而不是编译时。 (我正在寻找消息来源,但目前无法找到它。)这是真的吗?如果是这样,功能中的警卫是否具有相同的性能?
阅读这一点对我来说是令人惊讶的,因为我曾经认为GHC能够在编译期间优化一些(可能不是全部)模式匹配决策。这会发生吗?
例如:
f 1 = 3
f 2 = 4
VS
f' a | a == 1 = 3
| a == 2 = 4
f
和f'
编译到相同数量的指令(例如在Core和/或更低版本中)?
如果我在构造函数上模式匹配而不是值,情况是否有所不同?例如。如果GHC发现总是使用一个构造函数调用某个位置的函数,它是否会以消除运行时检查的方式优化该调用?如果是这样,你能给我一个展示优化产生的例子吗?
在性能方面有哪些有关这两种方法的好处?
什么时候表现更好?
答案 0 :(得分:14)
不要介意模式与警卫,你也可以问if
与case
。
模式匹配是优先于等式检查。在Haskell中进行平等检查并不是一件很自然的事情。 Boolean blindness是一个问题,但除了完全相等的检查通常是不可行的 - 例如无限列表永远不会比较平等!
直接模式匹配的效率取决于类型。在数字的情况下,不要期望有太大差异,因为这些模式是通过等式检查实现的 。
我通常更喜欢模式 - 因为它们更好,可以更高效。平等检查要么同样昂贵,要么可能更昂贵,并且只是非惯用的。只在必要时才使用布尔评估,否则坚持模式(也可以是in guards)!