2013-09-21 7 views
3

Как создать 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 ... 

Но, похоже, реализация не тривиальный

+3

Вы пробовали 'Kleisli (FreeT f m)'? –

+0

приятно! Я попробую! – wit

+0

@SjoerdVisscher Вы хотите написать это как ответ? – AndrewC

ответ

1

Если m' является экземпляром Monad, затем Kleisli m' - это пример Arrow (и куча других связанных моделей, таких как ArrowApply).

В вашем случае, вы хотите использовать FreeT f m в качестве основной монады (для некоторых Functor f и Monad m), так что вы можете просто установить m' в FreeT f m и получить именно то, что вы хотите: Kleisli (FreeT f m).

 Смежные вопросы

  • Нет связанных вопросов^_^