繁体   English   中英

为什么在Control.Arrow中没有Kleisli的Functor实例?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM