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)
有没有提供此实例的原因?它是否作为孤立实例存在于某个包中?
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包装进去.