#loops #haskell #enumerator
#циклы #haskell #перечислитель
Вопрос:
В настоящее время существует два популярных варианта, которые реализуют шаблон итерации:
Каковы их относительные преимущества? Является ли один из них лучше другого, или это зависит от варианта использования (и если да, то каковы критерии для определения того, какой из них использовать)?
Ответ №1:
Существует как минимум три библиотеки итерации:
- перечислитель
- итерация
- iterIO
Я считаю, что библиотека enumerator в настоящее время является предпочтительной из-за ее простоты. Это также тот, который я использую для своих проектов, если вам интересно. Два других пакета более гибкие и могут быть быстрее в разы, но они также более сложны. Если вы хотите изучить итерации, я предлагаю начать с enumerator. Это самая прямая реализация оригинальной идеи Олега.
Если у вас есть конкретный вариант использования и вам нужно много функций со стандартным подходом iteratee, вы можете рассмотреть возможность использования пакета iteratee. В более сложных сценариях вы также можете попробовать пакет iterIO, который имеет несколько иную и более гибкую концепцию. В частности, итерации могут взаимодействовать с перечислителем, что невозможно в двух других пакетах.
Если все три пакета недостаточно гибкие, вы, вероятно, захотите написать свои сопрограммы самостоятельно с помощью пакета monad-coroutine. Итерации и счетчики — это особый тип сопрограмм, которые могут быть составлены определенным образом. Пакет monad-coroutine предоставляет вам общий тип и позволяет использовать вашу собственную концепцию взаимодействия.
Комментарии:
1. Один незначительный нюанс:
iteratee
итераторы также могут взаимодействовать с enumerator. Например, вот какseek
это реализовано. Однако это не так сложно, какiterIO
механизм.2. @ertes, как насчет других свойств, таких как, например, эффективность / производительность? Можно ли объединить библиотеки, не использующие одну и ту же библиотеку итерации?
3. Как правило, нет, библиотеки несовместимы друг с другом.
4. Действительно ли iterIO «более сложный»? Я думал, что вся его цель состояла в том, чтобы упростить, объединив концепцию iteratee и enumerator.