Я думаю, что ваша "цепная" функция очень запутана. Вы должны переосмыслить это. В нем используется значение «xs», которое, кажется, не находится в области видимости. Откуда взялась "хз"? Предположительно это должен быть аргумент.
Лучшим подходом было бы создать бесконечный список чисел, сгенерированных проблемой, и затем обнаружить внутри нее циклы. Вы можете получить бесконечный список для начального значения "n", используя
numberSequence n = iterate sumFac n
Тогда ищи циклы. Вы должны сравнить каждый номер со всеми предыдущими номерами. Простой, но неэффективный способ состоит в том, чтобы создать список по ходу дела, сверяя каждое число с текущим списком, а затем добавляя число к списку при рекурсивном вызове. Более эффективным решением было бы использование Data.Set.
Кстати, fac n = product [1..n]. Ваша версия работает, но излишне многословна. (На самом деле, если вы подставите определение «product» и desugar «[1..n]», вы получите свою версию).