Что альтернатива для монад должны использовать IO в чистом функциональном программировании?

монады описаны как haskell решение иметь дело с IO. Я задавался вопросом, были ли другие способы иметь дело с IO на чистом функциональном языке.

34
задан Johnny Blaze 29 January 2010 в 02:09
поделиться

5 ответов

См. Операторы C # для операторов C #, включая оператор OR, который является | |

-121--2066769-

У нас та же проблема. В случае, когда у вас есть проблема (ошибка или новая функция), которая включает в себя несколько продуктов и которые имеют зависимости между ними. (Например, у нас есть сервер, API подключения и клиентское приложение). Если есть новая идея о расширении клиентского приложения определенным образом, вполне возможно, что также api и сервер подключения нуждаются в каком-то расширении. Наверное, их разрабатывают разные команды... Таким образом, не обрабатывается в том же спринте/итерации, но как владелец продукта вы хотите отслеживать все эти новые функции как группа.

Мы создали несколько пользовательских полей. Первое поле, которое мы ввели, было «Каскадный выбор», как «Программа» и «Фаза». Это дает владельцам продукта возможность группировать проблемы в рамках программы и выполнять некоторые приблизительные долгосрочные планы (несколько итераций).

Затем мы добавили другое поле (текстовое поле) для «Epic» (или «Theme»), которое объединяет вопросы, связанные с определенной эпопеей/темой. Идея в том, чтобы использовать «Эпосы» в рамках «Программы.» В случае большей «Программы», вероятно, можно разделить её на разные части, которые затем отражаются в этих «Эпосах». (Своего рода сюжетная линия. Группа историй (которая может распространяться на несколько продуктов), которые добавляют ценность как дыра в серии продуктов).

Теперь оба поля упрощают фильтрацию проблем, связанных с несколькими продуктами, на основе программы (с ее фазой или без нее) и эпоса.

При включенном связывании теперь можно также создавать зависимости между различными проблемами в различных продуктах. И он полностью отделен от управления версиями продукта Jira по умолчанию. Это замечательно, поэтому нормальный процесс высвобождения остается таким, какой он есть.

Еще одна идея, которую я думаю представить - это поле «Итерация». При переходе к сеансу планирования (или сразу после него). Это поле может быть обновлено именем этого спринта (Jira отлично подходит для редактирования/обновления нескольких выпусков). Что затем позволяет легко отфильтровывать все проблемы для этого спринта.

Что мне больше всего нравится в использовании Jira также в качестве инструмента Scrum planning/Sprint tracking, так это то, что у вас нет отдельного инструмента планирования и задержки. Ошибки более заметны. Нет двойного администрирования ошибок в средстве планирования и или предметов планирования в средстве отслеживания ошибок (для правильных номеров cvs/svn/etc commit). Или генерация заметок о выпуске.

-121--2281112-

Какие альтернативы существуют монадам для ввода-вывода на чисто функциональном языке?

Мне известны две альтернативы в литературе:

  • Одна из них - так называемая система линейного типа . Идея заключается в том, что значение линейного типа должно использоваться ровно один раз: нельзя игнорировать его, а нельзя использовать дважды. Имея в виду эту идею, вы даете состоянию мира абстрактный тип (например, Мир ),и вы делаете его линейным. Если я отмечу линейные типы звездой, то вот типы некоторых операций ввода-вывода:

     getChar:: World * - > (Char, World *)
    putChar:: Char - > Мир * - > Мир *
    

    и так далее. Компилятор организует, чтобы убедиться, что вы никогда не копируете мир, и затем он может организовать компиляцию кода, который обновляет мир на месте, что безопасно, потому что есть только одна копия.

    Уникальность набора на языке Clean основана на линейности.

    Эта система имеет несколько преимуществ; в частности, он не обеспечивает полное упорядочение событий, которые делают монады. Это также имеет тенденцию избегать « IO sin bin» вы видите в Haskell, где все эффективные вычисления выбрасываются в IO monad, и все они полностью упорядочены, хотите вы полный порядок или нет.

  • Другая система я знаю о предыдущих монад и Clean и основан на идее (возможно, бесконечная) последовательность запрашивает (возможно, бесконечную) последовательность ответов . Эта система, которая называлась «диалоги», была чистым адом для программирования. Никто не пропускает его, и ему особо нечего было рекомендовать. Его ошибки хорошо перечислены в статье, которая представила monadic I/O ( Императивное функциональное программирование ) Wadler и Peyton Jones. В этой статье также упоминается система ввода-вывода, основанная на продолжениях, которые были введены группой Йеля Хаскелла, но которые были кратковременными.

35
ответ дан 27 November 2019 в 16:47
поделиться

Если под "чистым" вы подразумеваете "произвольно прозрачным", то есть то, что применяемая функция свободно взаимозаменяема со своим вычисляемым результатом (и, следовательно, вызов функции с одними и теми же аргументами имеет один и тот же результат каждый раз), то любое понятие stateful IO практически исключается по определению.

Есть две грубые стратегии, о которых я знаю:

  • Пусть функция выполняет IO, но убедитесь, что она никогда не может быть вызвана дважды с одними и теми же аргументами; эта сторона - шаг вперед, позволяя функциям быть тривиально "referenarily transparent" (объективно прозрачными).

  • Рассмотрим всю программу как единственную чистую функцию, принимающую в качестве аргумента "все входные данные получены" и возвращающую "все выходные данные произведены", причем обе они представлены некой формой ленивого потока, позволяющего интерактивность.

Существует множество способов реализации обоих подходов, а также некоторая степень перекрытия - например, во втором случае функции, работающие на потоках ввода/вывода, вряд ли будут вызываться дважды с одной и той же частью потока. Какой из вариантов имеет больший смысл, зависит от того, какую поддержку предоставляет язык.

В Хаскелле IO - это тип монада, который автоматически передает через код последовательное состояние (аналогично функционально чистому State monad), так что, концептуально, каждый вызов нечистой функции получает разное значение неявного "состояния внешнего мира".

Другой известный мне популярный подход использует нечто вроде линейных типов с аналогичной целью; гарантируя, что нечистые функции никогда не получат дважды одни и те же аргументы, имея значения, которые невозможно скопировать или дублировать, так что старые значения "состояния внешнего мира" не могут быть сохранены и использованы повторно.

5
ответ дан 27 November 2019 в 16:47
поделиться

Уникальность набора уникальности используется в Чистые

4
ответ дан 27 November 2019 в 16:47
поделиться

Императивное функциональное программирование Peyton Jones и Wadler является обязательным, если вы заинтересованы в функциональном IO. Другие подходы, которые они обсуждают:

  • диалоги, которые являются ленивыми потоками ответов и запросов

Тип диалога = [Ответ] -> [Запрос]

Главная :: Диалог

  • Продолжение - каждая операция IO Продолжение в качестве аргумента

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

5
ответ дан 27 November 2019 в 16:47
поделиться

Кроме линейных типов существует также система эффектов .

8
ответ дан 27 November 2019 в 16:47
поделиться
Другие вопросы по тегам:

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