Я хотел бы сделать ответ, чтобы обратить внимание на комментарий augustss :
На самом деле это не так. Случилось так, что тип карты был обобщен, чтобы охватить Functor в Haskell 1.3. I.e., в Haskell 1.3 fmap называлась картой. Затем это изменение было возвращено в Haskell 1.4 и введен fmap. Причина этого изменения была педагогической; при обучении Haskell новичкам очень общий тип карты затруднял понимание сообщений об ошибках. На мой взгляд, это был неправильный способ решить проблему.
blockquote>Haskell 98 рассматривается как шаг назад от некоторых Haskellers (включая меня), предыдущие версии, определяющие более абстрактные и согласованная библиотека. О, хорошо.
Вас подкосила лень filter
. Измените (filter ...)
на (doall (filter ...))
в вашей recur
форме, и проблема должна исчезнуть.
Более подробное объяснение:
Вызов filter
возвращает ленивый seq, который материализует фактические элементы отфильтрованного seq по мере необходимости. Как написано, ваш код складывает filter
на filter
на filter
..., добавляя еще один уровень filter
ing на каждой итерации; в какой-то момент это приводит к взрыву. Решение состоит в том, чтобы на каждой итерации принудительно менять весь результат, чтобы следующая итерация выполняла фильтрацию на полностью реализованном seq и возвращала полностью реализованный seq, а не добавляла дополнительный уровень ленивой обработки seq; вот что делает doall
.