list - 如何避免不必要的计算?

标签 list optimization haskell

如果列表中超过 3 个元素的测试失败,我需要返回 false。有什么我可以优化的吗?

isItemOk :: Integer -> Boolean 
isItemOk = ( some costly opernation )

这是我正在尝试优化的功能,

isListOk :: [Integer] -> Boolean 
isListOk = 3 >= sum ( [ 1 | x <- [1.1000], isItemOk x ])

我的优化尝试,假设找到 4 个元素就不再寻找更多元素。

isListOk :: [Integer] -> Boolean 
isListOk = 3 >= sum ( take 4 [ 1 | x <- [1.1000], isItemOk x ])

谢谢。

最佳答案

您可以仅使用 filter 来检查失败元素,然后take 4 并查看 length 有多少个元素。

惰性评估意味着在找到这四个之后它不会再检查任何东西,所以你就完成了。当然,如果测试因三个或更少的元素而失败,它将检查整个列表,但对此您无能为力。

避免的重要事情是“计算未通过测试的元素”,或“过滤然后获取结果的长度”,或类似的事情。如果不先使用 take 或类似的东西,这样做将强制检查整个列表。这是经常向初学者提供的“使用 null 或模式匹配来检查空列表”建议的更通用版本。但看起来您已经避免了这个错误!

关于list - 如何避免不必要的计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12504334/

相关文章:

c# - 对象列表转换的最佳方式是什么

c++ - 函数中局部变量的生命周期是否一定等于该函数执行的生命周期?

algorithm - 梯度下降算法在 Haskell 中不收敛

haskell - 解析冗余括号,同时在未提交的故障上恢复输入

Haskell - FFI 和指针

python - 嵌套列表排序 python 3

list - 在 OCaml 的列表中查找唯一元素

python - 如何将列表值与字典键进行比较并使用 python 创建一个新字典

java - else 语句会减慢编译时间/运行速度吗? (在可以避免的情况下)

c - 查找字符数相同的子字符串