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