2013-09-21 19 views
3

如何从FreeMonadFree创建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个参数mf,但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 fMonad m),所以你可以只设置m'FreeT f m,准确地得到你想要的:Kleisli (FreeT f m)