хороший пример - сумма списка чисел
если мы складываем список интов, то лучше делать хвостовой строгий фолд (foldl' то есть). Потому что по итогу нужно потребить результат целиком за раз
а вот если мы определим свой тип натуральных чисел + сложение + сравнение
data Nat = Zero | Succ Zero
(+) :: Nat -> Nat -> Nat
(+) Zero b = b
(+) (Succ a) b = Succ (plus a b)
(<=) :: Nat -> Nat -> Bool
Zero <= b = True
a <= Zero = False
Succ a <= Succ b = a <= b
то тут сложение генерирует значение, которое не обязательно потреблять целиком. Например, чтобы сравнить, что какое-то число x (которое предположим 10^6) меньше чем 100, достаточно только 100 итераций <=, поэтому если мы это число x считаем как сумму списка из 10^6 единиц, то достаточно потребить только 100 элементов списка фолдом, поэтому лучше подойдет ленивый не хвосторекурсивный foldr
таким образом можно и бесконечность описать, и тоже вполне успешно сравнивать ее с другими небесконечными числами
хм, получается даже так:
- строгое значение, которое нужно целиком потребить - строгая хвосторекурсивная функция
- ленивое значение, которое можно потребить постепенно - ленивая нехвосторекурсивная функция