У меня есть массив последовательностей с бесконечными итерациями (например, [6,6,6,6,6] или [23, 24, 23, 24] или [1, 2, 3, 4, 1, 2,3, 4]) Как мне перебирать каждый такой список в Haskell и возвращать только первую итерацию? В случае приведенных выше примеров: [6];[23, 24];[1, 2, 3, 4]
Спасибо!
Редактировать: Извините, я не был точным. Списки действительно бесконечны. Моя цель - вернуть список аликвотной последовательности заданного целого числа. У меня есть функция, которая возвращает сумму делителей. Я начал рекурсивный вызов с первой суммы и составил список. Это привело к спискам, как [6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6 ...].
Сначала я хотел решить проблему, взяв первую часть списка, вплоть до второго появления оригинального Int. Но потом меня поразило: с помощью elem
проще проверить, существует ли сумма в списке. Если да, вернуть список как есть. В противном случае добавьте сумму и продолжайте.
Редактировать 2: Код, который создает (по крайней мере в моем определении) бесконечный список, представляет собой следующий фрагмент:
aliquot :: (Integral a) => a -> [a]
aliquot 0 = []
aliquot 1 = [1]
aliquot n = n : (aliquot $ sum $ divisors n)
divisors :: (Integral a) => a -> [a]
divisors n = filter ((0 ==) . (n `mod`)) [1 .. (n `div` 2)]