конечно не хочу
я чувствую, что можно без IO сделать
но у меня нет другого выхода, видимо
То есть понятно, что (forall s. ST s a) -> a это на самом деле энкодинг exists s. ST s a -> a, но вот чем это помогает не вижу.
Читать полностью…а что если заюзать Control.Monad.Morph и перевести Conduit -> IORef и просто с ним рабоать? а потом обратно когда надо?
Читать полностью…это, видимо, не сработает, потому что я всё-таки хочу уметь два таких кондуита объединять
видимо, буду пытаться запустить кондуит внутри кондуита тогда, а потом runST
Если тебе хочется делать runST под Conduit через hoist, то это должен быть ConduitM i o (forall s. ST s) r, который надо энкодить ньютайпом над ST чтобы не было импредикативности.
Читать полностью…Я могу себе представить конверсию в одну сторону (forall floats out), но не в другую (forall floats in).
Читать полностью…Я не понял при чем тут экзистенциальная квантификация, если тут квантор всеобщности, и как поможет Forall, который вообще для констрейнтов.
Читать полностью…Но у тебя, естественно, не будет внутри кондуита доступа к STRef, созданным за его пределами.
Читать полностью…{-# LANGUAGE RankNTypes #-}
module STForall where
import Control.Monad.ST
newtype AST a = AST { runAST :: forall s. ST s a }
instance Functor AST where
fmap f (AST st) = AST (fmap f st)
instance Applicative AST where
pure a = AST (pure a)
AST f <*> AST a = AST (f <*> a)
instance Monad AST where
m >>= f = AST $ do
x <- runAST m
runAST (f x)
откуда IORef? там cborg как-то внутри у себя юзает ST, я не могу его попросить складывать всё в одну переменную
Читать полностью…Если у тебя forall s. ConduitM i o (ST s) r, то лучшее что ты можешь сделать, это сначала запустить conduit, а потом сделать runST, и получить в итоге r
Читать полностью…Потому что семантика у этих штук разная:
[forall s. ST s a] — список независимых ST действий, каждое из них можем запустить отдельно, между ними нет shared STRef-ов
forall s. [ST s a] — список ST-действий с одним и тем же s, между ними могут быть shared STRef-ы