Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 自由和自由的箭_Haskell_Monads_Arrows_Free Monad - Fatal编程技术网

Haskell 自由和自由的箭

Haskell 自由和自由的箭,haskell,monads,arrows,free-monad,Haskell,Monads,Arrows,Free Monad,如何从Free和MonadFree创建箭头 class (Functor f, Monad m) => MonadFree f m where ... data Free f a = Impure (f (Free f a)) | Pure a MonadFree包含两个参数m和f,但是Kleisli没有空间插入f,因此我们不能对MonadFree使用Kleisli箭头 据我所知,需要创建一个类、一个新类型和一个实例,如下所示: class Arrow a => ArrowFun

如何从
Free
MonadFree
创建
箭头

class (Functor f, Monad m) => MonadFree f m where ...

data Free f a = Impure (f (Free f a)) | Pure a
MonadFree包含两个参数
m
f
,但是
Kleisli
没有空间插入
f
,因此我们不能对
MonadFree
使用
Kleisli
箭头

据我所知,需要创建一个类、一个新类型和一个实例,如下所示:

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 ...

但实现似乎并不繁琐

如果
m'
Monad
的一个实例,那么
Kleisli m'
Arrow
的一个实例(以及一系列其他相关的类型类,如
Arrow>


在您的例子中,您希望使用
FreeT f m
作为底层monad(对于某些
Functor f
monad m
),因此您只需将
m'
设置为
FreeT f m
就可以得到您想要的:
Kleisli(FreeT f m)

您试过
Kleisli(FreeT f m)吗
?@SjoerdVisscher您愿意将此作为答案吗?