Dies ist keine Antwort, aber es passt nicht in einen Kommentar.
Ich wollte eine ähnliche Funktionalität auch haben. Ich vermute, dass der interne Typ wird wie folgt aussehen:
-- The same `FreeF` type from the `free` package in `Control.Monad.Trans.Free`
data FreeF f a x = Pure a | Free (f x)
newtype FreeP f p a' a b' b m r
= FreeP { unFreeP ::
p a'
(FreeF f a (FreeP f p a' a b' b m r))
b'
(FreeF f b (FreeP f p a' a b' b m r))
m
(FreeF f r (FreeP f p a' a b' b m r)) }
Auch ist es nicht mit den aktuell vorhandenen Maschinen möglich sein könnte, aber das ist in Ordnung. Konsultieren Sie zum Beispiel den StateP
Proxy-Transformer, der auf thread_P
von ProxyInternal
angewiesen ist. Ein ähnliches Analog zu thread_P
könnte erforderlich sein, um FreeP
zu implementieren.