Недавно я узнал о Data.Function.fix
, и теперь я хочу применять везде. Например, всякий раз, когда я вижу рекурсивную функцию, я хочу ее «fix
». Так что в основном мой вопрос в том, где и когда мне его использовать.
Чтобы сделать его более конкретным:
1) Предположим, у меня есть следующий код для факторизации n
:
f n = f' n primes
where
f' n (p:ps) = ...
-- if p^2<=n: returns (p,k):f' (n `div` p^k) ps for k = maximum power of p in n
-- if n<=1: returns []
-- otherwise: returns [(n,1)]
Если я его перепишу в терминах fix
, я что-нибудь получу? Что-то теряете? Возможно ли, что, переписав явную рекурсию в fix
-версию, я разрешу или наоборот создам переполнение стека?
2) При работе со списками есть несколько решений: рекурсия / исправление, foldr / foldl / foldl 'и, возможно, что-то еще. Есть ли какое-либо общее руководство / совет о том, когда использовать каждый из них? Например, не могли бы вы переписать приведенный выше код, используя foldr
над бесконечным списком простых чисел?
Есть, наверное, другие важные вопросы, не затронутые здесь. Также приветствуются любые дополнительные комментарии, связанные с использованием fix
.