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

dan*_*iaz 8 haskell arrows functor

在尝试熟悉Control.Arrow时,我注意到Kleisli newtype似乎承认了Functor实例,例如:

instance Monad m => Functor (Kleisli m a) where
    fmap f (Kleisli k) = Kleisli $ liftM f . k
Run Code Online (Sandbox Code Playgroud)

有没有提供此实例的原因?它是否作为孤立实例存在于某个包中?

Pet*_*lák 7

Functor通过定义,每个箭头都可以变为有效

fmap f a = a >>> arr f
Run Code Online (Sandbox Code Playgroud)

然而Functor,Arrow由于它们的种类不同(Functor需要* -> *Arrow需要* -> * -> *),因此不可能将a声明为超类.因此,每个箭头都需要单独定义实例.

你可以用任何箭头ArrowMonad,然后给出一个Applicative实例(因此也Functor)instance Arrow a => Applicative (ArrowMonad a) where ....

我没有看到为什么Kleisli缺少Functor实例的任何特殊原因.最可能的似乎是你不需要它.如果您想使用functorial(或applicative或monadic)操作,可以在原始monad上执行.您只需Kleisli在需要箭头界面时将monad包装进去.