[Haskell] Kleisli Arrow and Kleisli Category

1. Kleisli Arrow

Arrow是Control.Arrow模塊定義的一個(gè)類型類(class),
包含了,arr,first,second(***),以及(&&&)這幾個(gè)方法。

對(duì)于每一個(gè)Monad,我們可以定義相應(yīng)的Kleisli Arrow,

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

例子:因?yàn)?code>[]是一個(gè)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是怎樣定義的,



因此,一個(gè)Monad (T, η, μ)就是一個(gè)自函子T,以及兩個(gè)自然變換ημ
并且滿足一些約束條件(law)。

然后,再看Kleisli Category的定義,


因此,假設(shè)范疇X中定義了一個(gè)Monad T,則X對(duì)應(yīng)的Kleisli Category,
它的對(duì)象(object)一一對(duì)應(yīng)范疇X中的對(duì)象,
它的箭頭(arrow)一一對(duì)應(yīng)范疇X中的箭頭,f : x -> T y
這個(gè)箭頭,正是Monad T對(duì)應(yīng)的Kleisli Arrows。


使用Haskell,表示自函子(endofunctor)與自然變換(natural transformation)。

-- 自函子T,作用在對(duì)象上時(shí)
fObj :: (Applicative f) => a -> f a
fObj = pure

-- 自函子T,作用在箭頭上時(shí)
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

-- 單位自函子,作用到對(duì)象上時(shí)
iObj :: a -> a
iObj = id

-- 單位自函子,作用到箭頭上時(shí)
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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容