美文网首页Haskell
[Haskell] Kleisli Arrow and Klei

[Haskell] Kleisli Arrow and Klei

作者: 何幻 | 来源:发表于2017-03-14 16:55 被阅读97次

    1. Kleisli Arrow

    Arrow是Control.Arrow模块定义的一个类型类(class),
    包含了,arrfirstsecond(***),以及(&&&)这几个方法。

    对于每一个Monad,我们可以定义相应的Kleisli Arrow

    newtype Kleisli m a b = Kleisli {
      runKleisli :: (a -> m b) 
    }
    

    例子:因为[]是一个Monad,

    import Control.Arrow
    
    double' :: Kleisli [] Integer Integer
    double' = arr (*2)
    
    runKleisli double' 1
    > [2]
    

    2. Kleisli Category

    In category theory, a Kleisli category is a category naturally associated to any monad T.

    为此,我们先看在范畴论(category theory)中Monad是怎样定义的,



    因此,一个Monad (T, η, μ)就是一个自函子T,以及两个自然变换ημ
    并且满足一些约束条件(law)。

    然后,再看Kleisli Category的定义,


    因此,假设范畴X中定义了一个Monad T,则X对应的Kleisli Category
    它的对象(object)一一对应范畴X中的对象,
    它的箭头(arrow)一一对应范畴X中的箭头,f : x -> T y
    这个箭头,正是Monad T对应的Kleisli Arrows


    使用Haskell,表示自函子(endofunctor)与自然变换(natural transformation)。

    -- 自函子T,作用在对象上时
    fObj :: (Applicative f) => a -> f a
    fObj = pure
    
    -- 自函子T,作用在箭头上时
    fArr :: (Applicative f) => (a -> b) -> (f a -> f b)
    fArr = fmap
    
    -- 自函子T·T
    f2Obj :: (Applicative f) => a -> f (f a)
    f2Obj = fObj . fObj
    
    f2Arr :: (Applicative f) => (a -> b) -> (f (f a) -> f (f b))
    f2Arr :: fArr . fArr
    
    -- 单位自函子,作用到对象上时
    iObj :: a -> a
    iObj = id
    
    -- 单位自函子,作用到箭头上时
    iArr :: (a -> b) -> (a -> b)
    iArr = id
    
    -- 自然变换 µ : T·T -> T,分量 µ a : T·T a -> T a
    µ :: (Applicative f) => a -> f (f a) -> f a
    
    -- 自然变换 η:I -> T,分量 η a : I a -> T a
    η :: (Applicative f) => a -> a -> (f a)
    

    参考

    Kleisli Arrows
    Kleisli Category
    Monad
    Monads and Algebra structures

    相关文章

      网友评论

        本文标题:[Haskell] Kleisli Arrow and Klei

        本文链接:https://www.haomeiwen.com/subject/ctdhnttx.html