Подтвердить что ты не робот

Влияет ли итерация ввода-вывода на нефункциональные языки?

В Haskell Iteratee based I/O кажется очень привлекательным. Iteratees - это сложные, безопасные и быстрые способы ввода-вывода, основанные на функции "fold" a.k.a. "уменьшить" на функциональных языках. В принципе, если у вас есть обход, идея состоит в том, чтобы инкапсулировать состояние обхода в так называемый "перечислитель", который вызывает "итерацию", которая, в свою очередь, выполняет функцию, возвращающую значение или запрос на большее количество данных вместе с продолжением для перечислитель для вызова. Таким образом, только перечислитель знает состояние обхода, в то время как итератор знает, что делать с данными и выстраивает из него значения. Самое приятное в том, что итерации автоматически скомпонованы, когда вывод одного итератора подается на другой, чтобы сделать более крупным.

Итак, два вопроса:

  • Означает ли понятие даже на других языках, например, на простых объектно-ориентированных языках, или это полезно только для преодоления недостатков Haskell lazy I/O?
  • Существуют ли какие-либо фактические реализации для других языков, особенно С# (как это то, что использует моя компания)? (В поиске Google появляется одно упоминание об итерациях в Scala, ну, я не заинтересован в Scala прямо сейчас).
4b9b3361

Ответ 2

Прежде всего, поймите, что Haskell "Lazy IO" - это своего рода хак, который прерывает чистоту ограниченным образом, позволяя осуществлять ввод-вывод по требованию, поскольку данные потребляются лениво. Это обычное дело на нечистом языке, и ленивые последовательности могут создавать одну и ту же проблему в любом месте. Поэтому, если вы делаете что-то вроде, скажем, раскрываете интерфейс IEnumerable для файла и читаете его пошагово по мере перечисления последовательности, это не совсем так.

Во-вторых, итерации и перечислители также могут быть сгруппированы в так называемые (несколько неуклюжие) перечисления. На этом этапе у вас есть что-то, что кормятся последовательными данными, производя дополнительные результаты по мере их готовности и подавая эти результаты на что-то другое. Это в основном разнообразный потоковый процессор, концепция которого, вероятно, предшествует как Haskell, так и С# значительным запасом.

В-третьих, итерации - это инкапсуляция абстрактного поведения, скрытая их внутренняя работа. Это, возможно, больше соответствует принципам OO, чем функциональному программированию ML-стиля, по крайней мере в смысле "принципов OO", которые поддерживаются людьми, которые кричат ​​на вас за использование геттеров и сеттеров и поток управления мышью должны быть реализованы через полиморфизм.

Учитывая вышеизложенное, я бы сказал, что концепция iteratee будет очень хорошо соответствовать С# и будет наиболее естественным образом реализована как своего рода инвертированный эквивалент IEnumerable, с композиционными объектами потока данных и "push" интерфейс, а не стандартный стиль LINQ "pull".