в Глазго на Хаскеле, но это не очень интересный факт.

от вопрос уже есть ответ здесь:

Есть ли монада, у которой нет соответствующего монадного трансформатора (кроме 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 не имеет монадного трансформатора.

Ответы на вопрос(1)

Ваш ответ на вопрос