我几乎不了解haskell,并试图解决一些Project Euler问题.在解决5号问题时,我写了这个解决方案(适用于1..10)
--Check if n can be divided by 1..max
canDivAll :: Integer -> Integer -> Bool
canDivAll max n = all (\x -> n `mod` x == 0) [1..max]
main = print $ head $ filter (canDivAll 10) [1..]
Run Code Online (Sandbox Code Playgroud)
现在我发现了,这all是这样实现的:
all p = and . map p
Run Code Online (Sandbox Code Playgroud)
这是不是意味着,检查每个元素的条件?打破条件的第一个假结果会不会快得多?这将使上面的代码执行更快.
谢谢
vir*_*tor 20
and本身是短路,因为这两个map和all评价是懒惰的,你只会得到一样多的元素需要-没有更多.
您可以使用GHCi会话验证:
Prelude Debug.Trace> and [(trace "first" True), (trace "second" True)]
first
second
True
Prelude Debug.Trace> and [(trace "first" False), (trace "second" False)]
first
False
Run Code Online (Sandbox Code Playgroud)