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您愿意将此作为答案吗?