Я изучаю Haskell, и я решаю problem 30 on project Euler.Перерыв целого числа на список цифр
digits n = if n<10 then [n] else (digits (quot n 10)) ++ [(mod n 10)]
isP30 n = (sum $ map (^5) $ digits n) == n
sum $ filter isP30 [10^5..10^6-1]
Есть ли более читаемым способ реализации функции digits
?
Как насчет использования [разворачивания] (http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-List.html#v:unfoldr)? –
@BenjaminHodgson, не могли бы вы рассказать? –
'unfoldr' обобщает цикл, который создает элемент списка на каждом шаге. Все, что вам нужно сделать, это определить функцию, которая, учитывая текущее «состояние» цикла, принимает решение о прекращении создания значений списка («Nothing») или создании значения ('x') и повторении цикла с новым состоянием (' s ') (выполняется с помощью' Just (x, s) '. Например,' unfoldr (\ n -> if n == 10 then Nothing else Just (n, n + 1)) 0' будет выдавать '[0..9 ] '. Вы можете использовать это для создания своих цифр в обратном направлении и« обратного »их в конце. – chi