Haskell 函数和Kleisli箭头的应用
Haskell 函数和Kleisli箭头的应用,haskell,typeclass,kleisli,Haskell,Typeclass,Kleisli,()和(MA->MB 有一个类型类可以抽象这些应用程序函数吗?正如Daniel的评论所说,(=*(结果是Category),在($)和(=两个示例都是函子的箭头映射)(不是函子,而是更广泛范畴意义上的函子),就像fmap是函子(=))的箭头映射,因此它只是标识的fmap,而没有标识包装(参见丹尼尔·瓦格纳对该问题的评论).通过适当的扩展和导入,($)::对于所有a b.(a->b)->a->b;($)=强制((= (.) :: (b -> c) ->
()
和(MA->MB
有一个类型类可以抽象这些应用程序函数吗?正如Daniel的评论所说,
(=*
(结果是Category
),在($)
和(=两个示例都是函子的箭头映射)(不是函子
,而是更广泛范畴意义上的函子),就像fmap
是函子
(=)
)的箭头映射,因此它只是标识
的fmap
,而没有标识
包装(参见丹尼尔·瓦格纳对该问题的评论).通过适当的扩展和导入,($)::对于所有a b.(a->b)->a->b;($)=强制((=
(.) :: (b -> c) -> (a -> b) -> (a -> c)
(<=<) :: Monad m => (b -> m c) -> (a -> m b) -> (a -> m c)
(<<<) :: (Category f) => f b c -> f a b -> f a c
($) :: (a -> b) -> a -> b
(=<<) :: Monad m => (a -> m b) -> m a -> m b
f $ x
Identity . f =<< Identity x
class (Category r, Category t) => Functor f r t | f r -> t, f t -> r where
fmap :: r a b -> t (f a) (f b)
-- `(.)` is plain old Prelude `(.)`, and not the generalised `Category` one.
instance Monad m => Functor m (Kleisli m) (->) where
fmap = (=<<) . runKleisli
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
import Control.Arrow (Kleisli(..))
import qualified Control.Categorical.Functor as F
newtype BindF m a = BindF { runBindF :: m a }
deriving (Functor, Applicative, Monad, Show)
instance Monad m => F.Functor (BindF m) (Kleisli (BindF m)) (->) where
fmap = (=<<) . runKleisli
GHCi> F.fmap (Kleisli (BindF . replicate 2)) (BindF [1,2,3])
BindF {runBindF = [1,1,2,2,3,3]}