[英]Why there isn't a Functor instance for Kleisli in Control.Arrow?
在尝试熟悉Control.Arrow时 ,我注意到Kleisli newtype似乎承认了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
声明为Arrow
的超类( Functor
需要* -> *
而Arrow
需要* -> * -> *
)。 因此,每个箭头都需要单独定义实例。
您可以使用ArrowMonad
包装任何箭头,然后给出一个Applicative
实例(因此也是一个Functor
): instance Arrow a => Applicative (ArrowMonad a) where ...
我没有看到为什么Kleisli
缺少Functor
实例的任何特殊原因。 最可能的似乎是你不需要它。 如果您想使用functorial(或applicative或monadic)操作,可以在原始monad上执行。 当您需要箭头界面时,您只需将monad包装到Kleisli
。
UPDATE
在Control.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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.