Проблемы монад и алгебраические эффекты
В продолжение про проверяемые исключения в Scala — очень доступный доклад про проблемы монад и способы их решения. Первые 26 минут можно посмотреть, если хотите освежить в памяти, что такое монада, и как она проникла в ваш любимый язык, докладчик рассказывает на простейшем примере. Но кто уже знаком с этой идеей, может смело мотать на середину.
Первая и основная на мой взгляд проблема, с которой сталкиваешься при композиции нескольких Either/Result’ов — общий тип для ошибок. Кстати, это одна из проблем, на которую я мужественно забил во время своих забав с elm. Кроме этого, функции приобретают цвета, а с типами вроде Either[Either[ClientError, ServerError], Response]
легко запутаться.
Одно из решений — Monad Transformers в Haskell, которые позволяют запихать одну монаду внутрь другой. Однако это довольно трудное для восприятия решение (судите сами) и типы все равно выглядят страшно.
Альтернативное решение — алгебраические эффекты. “Алгебраические” — потому что образуют алгебру, т.е. если функция f
имеет эффект A
, а функция g
имеет эффект B
, то любая их композиция будет иметь эффект C = A + B = B + A
, причем А + 0 = A
, где 0
— отсутствие эффекта. Алгебраические эффекты аналогичны по свойствам трансформерам, но должны быть проще для восприятия. И вариант их реализации, который описывает докладчик, практически идентичен тому, что предлагал Одерски больше года назад с проверяемыми исключениями (aka Capabilities).
В конце еще интересная мысль про то, что можно обрабатывать исключения и потом иметь возможность возвращаться к проблемному месту, но реализация этого явно дорога, а что она полезного даст — непонятно.