Почему монады? Как это устраняет побочные эффекты?

Я изучаю Haskell и пытаюсь понять монады. У меня два вопроса:

  1. Насколько я понимаю, Monad - это просто еще один класс типов, который объявляет способы взаимодействия с данными внутри «контейнеров», включая Maybe , List и ] IO . Кажется разумным и чистым реализовать эти 3 вещи с помощью одной концепции, но на самом деле суть в том, чтобы можно было обеспечить чистую обработку ошибок в цепочке функций, контейнеров и побочных эффектов. Это правильная интерпретация?

  2. Как именно решается проблема побочных эффектов? С этой концепцией контейнеров язык, по сути, говорит, что все внутри контейнеров недетерминировано (например, ввод-вывод). Поскольку списки и операции ввода-вывода являются контейнерами, списки классифицируются по эквивалентности с вводом-выводом, хотя значения внутри списков кажутся мне довольно детерминированными. Итак, что является детерминированным и что имеет побочные эффекты? Я не могу осмыслить идею о том, что базовое значение является детерминированным, пока вы не поместите его в контейнер (который ничем не отличается от того же значения с некоторыми другими значениями рядом с ним, например Ничего ) и теперь он может быть случайным.

Может кто-нибудь объяснить, как интуитивно Haskell уходит с рук, меняя состояние с помощью входов и выходов? Я не вижу здесь волшебства.

47
задан Micha Wiedenmann 18 April 2019 в 10:52
поделиться