Это спойлер для задачи №3 Project Euler! Не продолжайте читать, если вы хотите решить это самостоятельно.Понимание понимания списка в Haskell
Я пытаюсь изучить Haskell, написав программы для Project Euler. На данный момент я пытаюсь решить задачу №3, которая запрашивает наибольший простой коэффициент числа 600851475143.
Для этого я создаю список liste
, который содержит все числа, которые являются делителями этого числа (вверх к его squareroot). Теперь моя стратегия состоит в том, чтобы подсчитать делители этих чисел, чтобы решить, являются ли они главными.
number = 600851475143
-- sn = sqrt number
sn = 775146
liste = [x | x <- [1..sn], (mod number x == 0)]
-- liste = [1,71,839,1471,6857,59569,104441,486847]
primelist :: Int -> [Int]
primelist z = [y | y <- [1..z], mod z y == 0]
main = print [primelist x | x <- liste]
Результат, который должен появиться здесь, должен быть список, содержащий 8 списков с делителей элементов liste
. Вместо этого список
[[1],[1,3],[1,29],[1,3,29,87]]
печатается.
Как объяснить это поведение?
Я получаю '[[1], [1,71], [1,839], [1,1471], [1,6857], [1,71,839,59569], [1,71,1471,104441] , [1,71,6857,486847]] '(GHCi 7.6.3, Linux 64bits) – raymonad
Это интересно ... На данный момент я использую ideone, потому что я нахожусь в Windows. Тогда это кажется проблемой на их конце. – Stefan
Вероятно, переполнение Int. Вместо этого используйте 'Integer'. (Я просто проверяю гипотезу переполнения.) Да, это именно то, что я использую 'Int32' с этим кодом. –