如果列表中的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/