Рекурсивная функция, вызывающая переполнение стека

Я хотел бы сделать ответ, чтобы обратить внимание на комментарий augustss :

На самом деле это не так. Случилось так, что тип карты был обобщен, чтобы охватить Functor в Haskell 1.3. I.e., в Haskell 1.3 fmap называлась картой. Затем это изменение было возвращено в Haskell 1.4 и введен fmap. Причина этого изменения была педагогической; при обучении Haskell новичкам очень общий тип карты затруднял понимание сообщений об ошибках. На мой взгляд, это был неправильный способ решить проблему.

blockquote>

Haskell 98 рассматривается как шаг назад от некоторых Haskellers (включая меня), предыдущие версии, определяющие более абстрактные и согласованная библиотека. О, хорошо.

38
задан Community 23 May 2017 в 12:16
поделиться

1 ответ

Вас подкосила лень filter. Измените (filter ...) на (doall (filter ...)) в вашей recur форме, и проблема должна исчезнуть.

Более подробное объяснение:

Вызов filter возвращает ленивый seq, который материализует фактические элементы отфильтрованного seq по мере необходимости. Как написано, ваш код складывает filter на filter на filter..., добавляя еще один уровень filtering на каждой итерации; в какой-то момент это приводит к взрыву. Решение состоит в том, чтобы на каждой итерации принудительно менять весь результат, чтобы следующая итерация выполняла фильтрацию на полностью реализованном seq и возвращала полностью реализованный seq, а не добавляла дополнительный уровень ленивой обработки seq; вот что делает doall.

55
ответ дан 27 November 2019 в 03:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: