Я изучаю Haskell и пытаюсь понять монады. У меня два вопроса:
Насколько я понимаю, Monad - это просто еще один класс типов, который объявляет способы взаимодействия с данными внутри «контейнеров», включая Maybe
, List
и ] IO
. Кажется разумным и чистым реализовать эти 3 вещи с помощью одной концепции, но на самом деле суть в том, чтобы можно было обеспечить чистую обработку ошибок в цепочке функций, контейнеров и побочных эффектов. Это правильная интерпретация?
Как именно решается проблема побочных эффектов? С этой концепцией контейнеров язык, по сути, говорит, что все внутри контейнеров недетерминировано (например, ввод-вывод). Поскольку списки и операции ввода-вывода являются контейнерами, списки классифицируются по эквивалентности с вводом-выводом, хотя значения внутри списков кажутся мне довольно детерминированными. Итак, что является детерминированным и что имеет побочные эффекты? Я не могу осмыслить идею о том, что базовое значение является детерминированным, пока вы не поместите его в контейнер (который ничем не отличается от того же значения с некоторыми другими значениями рядом с ним, например Ничего
) и теперь он может быть случайным.
Может кто-нибудь объяснить, как интуитивно Haskell уходит с рук, меняя состояние с помощью входов и выходов? Я не вижу здесь волшебства.