Первый аплоад на Hackage

Comments

Немного оффтоп. У каждой ли монады есть соответствующий трансформер? И если да, есть какой-то автоматический способ получения трансформера из монады?

Не у каждой. У IO, в частности, нет.

Но должен быть. Больше того, они должны коммутировать между собой.

И вот почему. Допустим, что 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?

Нет. forall имеет значение 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

Всё, я понял свою ошибку, разобрался.

Спасибо

Post a comment

Already a Vox member? Sign in

migmit

About Me

migmit
Russian Federation
  • Powered by Vox