Casi no tenía conocimiento de Haskell y traté de resolver algunos problemas de Project Euler. Mientras que la solución de Number 5 escribí esta solución (por 1..10)Rendimiento de "todos" en haskell
--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..]
Ahora me enteré, que all
se implementa como esto:
all p = and . map p
no significa esto, la condición es revisado por cada elemento? ¿No sería mucho más rápido romper con el primer False-Result de la condición? Esto haría que la ejecución del código anterior sea más rápida.
Gracias
No creo que su problema es que no se dio cuenta de que 'y' cortocircuitos, sino que pensaba 'mapa 'iría a toda la lista antes de que 'and' se ejecute (como sería el comportamiento en los lenguajes ansiosos) porque no comprende/conoce la evaluación perezosa. – sepp2k