【发布时间】:2016-04-07 05:00:19
【问题描述】:
假设我想在 Haskell 的守卫中检查列表是否为空,有两个选项:
length list == 0list == []
这两个逻辑测试中哪一个更有效?我倾向于说空列表测试,因为它依赖于更基本的构造而不是前奏函数length,但我不确定。
【问题讨论】:
-
1 在列表的长度上是线性的(显然),而 2 是常数时间。但是 2 有一个陷阱,即当您并不真正需要它时需要
Eq约束。使用null或简单地通过模式匹配来检查空列表。 -
问题是当您想将相等性与其他预定义列表进行比较时,模式匹配不起作用
-
也谢谢你,这很有意义。你能详细说明 null 吗?
-
确实,如果您实际上是在比较相等性(而不仅仅是检查是否为空),那么
==是要走的路。null和(== [])一样需要恒定时间,但没有Eq约束。此外,在最新的几个 GHC 版本中,null被泛化为与任何Foldable一起使用,例如null :: Maybe a -> Bool如果输入为Nothing,则返回 true。 -
@user2407038 这应该是一个答案。
标签: haskell optimization