Стрелка из Free и MonadFree
Как создать Arrow
от Free
а также MonadFree
?
class (Functor f, Monad m) => MonadFree f m where ...
data Free f a = Impure (f (Free f a)) | Pure a
MonadFree содержит 2 параметра m
а также f
, но Kleisli
нет места для вставки f
поэтому мы не можем использовать Kleisli
стрелка для MonadFree
,
Как я понимаю, необходимо создать класс, новый тип и экземпляр, например:
class Arrow a => ArrowFunctor f a | a -> f where
afmap :: a b (f c)
newtype FKleisli f m a b = FKleisli { runFKleisli :: a -> f (m b) }
instance (Functor f, Monad m, MonadFree f m) =>
ArrowFunctor (FKleisli f m a) where ...
Но, похоже, реализация не тривиальна
1 ответ
Если m'
это пример Monad
, затем Kleisli m'
это пример Arrow
(и куча других, связанных классов типов, таких как ArrowApply
).
В вашем случае вы хотите использовать FreeT f m
в качестве основной монады (для некоторых Functor f
а также Monad m
), так что вы можете просто установить m'
в FreeT f m
и получите именно то, что вы хотите: Kleisli (FreeT f m)
,