Как создать Arrow
от Free
и MonadFree
?Arrow from Free and 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
.
Как я понимаю, нужно создать класс, NewType и экземпляр, как эти:
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 ...
Но, похоже, реализация не тривиальный
Вы пробовали 'Kleisli (FreeT f m)'? –
приятно! Я попробую! – wit
@SjoerdVisscher Вы хотите написать это как ответ? – AndrewC