Стрелка из 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),

Другие вопросы по тегам