haskell中"all"的表现

the*_*ega 7 haskell

我几乎不了解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本身是短路,因为这两个mapall评价是懒惰的,你只会得到一样多的元素需要-没有更多.

您可以使用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)