在尝试熟悉Control.Arrow时,我注意到Kleisli 新类型似乎承认 Functor 实例,例如:
instance Monad m => Functor (Kleisli m a) where
fmap f (Kleisli k) = Kleisli $ liftM f . k
没有提供此实例是否有原因?它是否作为孤立实例存在于某个包中?
在尝试熟悉Control.Arrow时,我注意到Kleisli 新类型似乎承认 Functor 实例,例如:
instance Monad m => Functor (Kleisli m a) where
fmap f (Kleisli k) = Kleisli $ liftM f . k
没有提供此实例是否有原因?它是否作为孤立实例存在于某个包中?
每个箭头都可以Functor
通过定义变为有效
fmap f a = a >>> arr f
但是,由于它们的种类不同(需要而需要) ,因此不可能将Functor
a 声明为超类。所以每个箭头都需要单独定义实例。Arrow
Functor
* -> *
Arrow
* -> * -> *
您可以用 包裹任何箭头ArrowMonad
,然后给出一个Applicative
实例(因此也是一个Functor
)instance Arrow a => Applicative (ArrowMonad a) where ...
:。
我看不出Kleisli
缺少Functor
实例的任何特殊原因。最有可能的是你不需要它。如果你想使用函数(或应用或单子)操作,你可以在原始单子上做。Kleisli
只有在需要箭头接口时才将 monad 包装进去。
更新
inControl.Arrow
已经定义:
(>>^) :: Arrow a => a b c -> (c -> d) -> a b d
(^<<) :: Arrow a => (c -> d) -> a b c -> a b d
更新 2
如果您希望将Free
Monad 插入Kleisli
- 这是不可能的,Free
有一个额外的参数f
。
所以你需要使用Arrow Transformer
或创建一个新Arrow
类,比如
class Arrow a => ArrowFunctor f a | a -> f where
afmap :: a b (f c)
包箭头包含一些示例,但未实现Free