1. Kleisli Arrow
Arrow是Control.Arrow模块定义的一个类型类(class),
包含了,arr
,first
,second
,(***)
,以及(&&&)
这几个方法。
对于每一个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
网友评论