Comments 5
Но почему рассматриваются только такие стыковочные схемы? По сути, они все являются частным случаем TUT. Но разве не может быть такой композиции функторов, чтобы для построения его монадного трансформера сработала бы схема TUTUT или ещё какая-нибудь?
По сути, они все являются частным случаем TUT
Я не использую подход какой принят в transformers с использованием функтора Identity, поэтому они отличаются как на уровне типов, так и на уровне внутренней логики.
Но разве не может быть такой композиции функторов
Я не утверждаю, что таких схем не существует. Если у вас есть какие-то примеры такого трансформера, можете поделиться.
Признаться, не силён в Haskell, но на вскидку в предложенные схемы не должны укладываться случаи, когда аргумент конструктора типа упоминается более одного раза (вроде `(a, a)`).
Кроме того, упомянутый в статье `ContT` - в его определении "неизвестный" `U` упоминается более одного раза, что, даже не учитывая заморочек с вариантностью, не подходит под схемы TUT. Не похоже, что это проблема, уникальная исключительно для `ContT`, для которого достаточно было бы предусмотреть индивидуальное решение). Кажется, есть более общие причины, почему стыковочные схемы могут не сработать.
Просто выглядит так, что предложенный метод - это лишь обобщение нескольких частных случаев, но не похоже на какое-то универсальное решение задачи композирования произвольных монад. Поэтому и решил уточнить - возможно, я что-то упускаю?
в предложенные схемы не должны укладываться случаи, когда аргумент конструктора типа упоминается более одного раза (вроде
(a, a)
)
newtype T'I'I t i = t i i
даже не учитывая заморочек с вариантностью, не подходит под схемы TUT
На самом деле вариантность здесь - не проблема. Можно разделить Cont
на два контрвариантых функтора (T'II'I (->)
), подобно поведению "минус и минус дают плюс" их композиция будет ковариантным функтором.
: Cont r a ~ ((a -> r) -> r)
: Cont r a ~ ((->) ((->) a r) r)
newtype T'II'I t i ii = t ii i
: Cont r a ~ ((->) ((->) a r) r)
: Cont r a ~ T'TT'I (T'II'I (->) r) (T'II'I (->) r) a
Cont
необычен именно тем что "неизвестный функтор U" оборачивается не над a, а
над r
. Тем не менее, подобрать просто какую-то другую схему всё равно можно, просто специльно для такого случая.
предложенный метод - это лишь обобщение нескольких частных случаев
Так и есть, но он достаточно успешно сейчас используется в языке программирования Я, вот тут можно посмотреть на примитивы и все они состоят из подобных схем и все являются функторами: https://iokasimov.github.io/Ya/Primitives/ (это прототип документации, в процессе заполнения).
Пытаясь композировать некомпозируемое: стыковочные схемы