Ceci n'est pas une réponse, mais il ne rentre pas dans un commentaire.
Je voulais une fonctionnalité similaire, aussi. Je soupçonne que le type interne ressemblera à ceci:
-- 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)) }
En outre, il pourrait ne pas être possible avec les machines qui existent actuellement, mais c'est correct. Par exemple, consultez le transformateur proxy StateP
, qui repose sur thread_P
de ProxyInternal
. Un analogue similaire à thread_P
peut être nécessaire pour implémenter FreeP
.