Недавно я узнал о 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
, также приветствуются.