Это не ответ, но он не будет вписываться в комментарий.
Мне тоже нужна аналогичная функциональность. Я подозреваю, что внутренний тип будет выглядеть следующим образом:
-- 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)) }
Кроме того, это не может быть возможно с существующей в настоящее время техники, но это нормально. Например, обратитесь к прокси-трансформатору StateP
, который опирается на thread_P
от ProxyInternal
. Аналогичный аналог thread_P
может понадобиться для реализации FreeP
.