Но должен быть. Больше того, они должны коммутировать между собой.
И вот почему. Допустим, что m :~> n - подтип forall x. m x -> n x, состоящий только из таких отображений, которые хорошо себя ведут по отношению к монадическим операциям. Это нельзя записать в системе типов Хаскеля - нужны зависимые типы или что-то вроде. Допустим, что такой тип есть. Тогда
newtype Trans n m x = Trans (forall k. Monad k => (m :~>k) -> (n :~> k) -> k x)
должно быть искомым трансформером. В смысле, Trans n m - монада, Trans n - трансформер. Если не вру, в частных случаях (типа, когда n - State) Trans n совпадает с соответствующим трансформером.
Comments
Немного оффтоп. У каждой ли монады есть соответствующий трансформер? И если да, есть какой-то автоматический способ получения трансформера из монады?
Но должен быть. Больше того, они должны коммутировать между собой.
И вот почему. Допустим, что m :~> n - подтип forall x. m x -> n x, состоящий только из таких отображений, которые хорошо себя ведут по отношению к монадическим операциям. Это нельзя записать в системе типов Хаскеля - нужны зависимые типы или что-то вроде. Допустим, что такой тип есть. Тогда
newtype Trans n m x = Trans (forall k. Monad k => (m :~>k) -> (n :~> k) -> k x)
должно быть искомым трансформером. В смысле, Trans n m - монада, Trans n - трансформер. Если не вру, в частных случаях (типа, когда n - State) Trans n совпадает с соответствующим трансформером.
forall k меня сбивает столку, в данном случае он равносилен exists?
data Baz x = ...
data Foo = forall x. Bar (Baz x)
- это именно что exists. В этом случае
Bar :: forall x. (Baz x -> Foo)
и здесь forall уже НЕ exists. Если же мы пишем
data Foo = Bar (forall x. Baz x)
то, опять же, forall - НЕ exists, и
Bar :: (forall x. Baz x) -> Foo
Всё, я понял свою ошибку, разобрался.
Спасибо