Это можно существенно улучшить, используя другой алгоритм: наименьшее число, которое можно разделить на набор чисел (в данном случае набор равен [1..10]), является наименьшим общим кратным из этих чисел.
Haskell даже имеет встроенную функцию наименьшего общего числа (lcm
), которую вы можете использовать:
Prelude> foldl lcm 1 [1..10]
2520
Если вы предпочитаете не использовать встроенную функцию lcm (поскольку это почти обманывает :)), вы можете сделать это с помощью алгоритма Евклида для вычисления GCD, а затем с помощью:
lcm a b = a * b `div` gcd a b
Если вам нужно найти все числа в данном списке, которые делятся на [1..n], вы можете использовать тот факт, что любое такое число также будет делиться на наименьшее общее кратное [1..n ]:
divis n xs = filter (\x -> x `mod` mult == 0) xs
where mult = foldl lcm 1 [1..n]