в Глазго на Хаскеле, но это не очень интересный факт.
от вопрос уже есть ответ здесь:
Есть ли монада, у которой нет соответствующего монадного трансформатора (кроме IO)? 4 ответаМонадные преобразователи известны всеми стандартными монадами (Reader, Writer, State, Cont, List и т. Д.), Но каждый из этих монадных преобразователей работает немного по-своему. Не существует общего метода или формулы для построения монадного преобразователя с учетом определения конструктора типа с экземпляром монады. Таким образом, не гарантируется, что тип данных монады, разработанный в соответствии с некоторыми произвольными бизнес-требованиями, будет иметь монадный преобразователь. Есть ли такой явный пример?
Связанных с работойДругой вопрос объясняет, что функторная композиция из двух монад не обязательно является монадой. Смотрите такжеэтот вопрос, Эти примеры не отвечают на данный вопрос - они просто иллюстрируют проблему отсутствия общего метода построения монадного трансформатора. Эти примеры показывают, что с учетом двух монад M и N мы иногда обнаруживаем, что M (N a) является монадой, иногда N (M a) является монадой, а иногда ни одна из них не будет монадой. Но это не показывает ни того, как построить монадный трансформатор для M или N, ни того, существует ли он вообще.
Ответ на другой вопрос утверждает, чтоIO
монадане можешь есть монадный трансформатор, потому что если бы он был одинIOT
мы могли бы применитьIOT
вList
, а затем поднимает пустой список (lift []
) в получившуюся монаду пришлось бы отменить побочные эффекты, выполненные «раньше» монадой IO. Этот аргумент основан на идее, чтоIO
Монада "фактически выполняет" побочные эффекты, которые, по-видимому, не могут быть отменены. ОднакоIO
Монада не является явным конструктором типов.
В каждом примере, где тип монады задан явно, можно найти преобразователь монадыкак-то- иногда с определенной изобретательностью требуется. Например,ListT
трансформатор, который существовал в библиотеке Haskell, былотносительно недавно не совсем точно, но проблема в конечном итоге была решена путем изменения определенияListT
.
Стандартными примерами монад без трансформаторов являются монады, такие какIO
, который на самом деле не определен явным конструктором типа -IO
непрозрачный «магический» тип, определенный библиотекойкак-тона низком уровне. Кажется очевидным, чтоне можешь определятьIO
в качестве явного конструктора типа с экземпляром монады, заданным чистыми функциями.IO
пример показывает, что преобразователь монады может не существовать, если мы позволим экземпляру монады содержать скрытый низкоуровневый код с нечистыми побочными эффектами. Итак, ограничимся вниманием монад, реализованных с использованием чистых функций.
Похоже, не существует алгоритма, который бы автоматически выводил монадные преобразователи из исходного кода монады. Знаем ли мы, что это всегда возможно?
Чтобы было более понятно, что я имею в виду под «явным примером» монады: предположим, я утверждаю, что
type Q u v a = ((u -> (a, Maybe a)) -> v) -> u -> (a, Maybe a)
может иметь законныйMonad
экземпляр по отношению к параметру типаa
и я создаю исходный код для реализацииMonad
экземпляр дляQ u v
как чистые функцииreturn
а такжеjoin
, Знаем ли мы тогда, чтоQ u v
имеет монадный трансформаторQT u v
такой, чтоQT u v Id
эквивалентноQ u v
, а законы монадных трансформаторов держатся? Мы тогда знаем, как построитьQT
явно? Я не.
Чтобы решить этот вопрос, нам нужно либо
продемонстрировать алгоритм, который мог бы найти преобразователь монад из произвольного заданного конструктора типа и заданную реализацию экземпляра монады; например учитывая кодtype F a = r -> Either (a, a) (a, a, Maybe a)
и реализация экземпляра монады для этого, чтобы найти код для преобразователя монады; давайте ограничимся конструкторами типов, сделанными из любой комбинации->
кортеж иEither
для простоты; или жепродемонстрировать контрпример:явный конструктор типа монады, заданный явным определением кода, например,type F a = r -> Either (a, a, a) (a, a, Maybe a)
или что-то такое, что это законноMonad
сMonad
экземпляр дан чистыми функциями, но мы можемдоказывать этоF
не имеет монадного трансформатора.