Читаю Сейджвика @ он пишет - "во многих языках итераторы добавлены как очень важная first-class парадигма" @ у меня бомбит от осознания что в хачкелле эта хуйня работает без специльного синтаксиса и говна @ пукан остывает, остается ощущение высоких абстракций и не обдумывание узконаправленного говна
@ndtimofeev Интерфейс ленивого списка изоморфен (имеет идентичную структуру) интерфейсам итераторов. // с точностью до языковых особенностей конкретного итератора; то есть если It1 бросает исключение
StopIteration
в-тех-же-и-только-тех ситуациях, где It2 возвращает False на.hasNext()
-- то It1 и It2 не рассматриваются как разные интерфейсы.Контракт следующий. Консьюмер итератора
it :: [V]
запрашивает следующий итемx :: V
путем патерн-матчинга поit
. В ответ на этоit
s продюсер вычисляет факт наличия следующего итема и в положительном сценарии сам итемx :: V
либо рецепт его вычисления (зависимо от ленивостиV
). Консьюмер получает факт наличия/отсутствия следующего итема как уже данное предположение в case-альтернативах. ЗначениеNil
означает конец итерации. Значение Cons дает следующий итемx :: V
и новое значение итератораit' :: [V]
.Звучит тривиально и по-капитански, ровно потому что это изоморфизм. Интерфейс ленивого списка и интерфейс Итератор идентичны по своей структуре.