自函子的Day Convolution和自函子的Composition有什麼區別?

applicative和monad都是自函子範疇上的張量範疇上的一個幺半群,幺半群的幺元都是identity functor,但是applicative的乘法是戴依卷積,monad的乘法是複合,請問這兩者有什麼區別。


啊,那……

這個意思大概是說,monad 是支持 return 和:

join :: forall a. F (F a) -&> F a

的函子。而我們有

newtype Compose f g a = Compose (f (g a))

所以我們可以等效地說,要有

join :: Compose F F a -&> F a

那麼 Day 的話……是……

data Day f g a where
Day :: forall u v. f u -&> g v -&> (u -&> v -&> a) -&> Day f g a

這個東西它……其實……uh……你想,我們有

liftA2 :: (u -&> v -&> a) -&> F u -&> F v -&> F a

而有它等效於

liftA2 :: Day F F a -&> F a

所以 Applicative 是支持 pure 和 liftA2 的函子。

好像還差個自函子範疇。函子之間有自然變換

newtype Nat f g = Nat (forall a. f a -&> g a)

顯然這個有 id,可以複合,那就是範疇了。

於是上面 join 和 liftA2 又等效於

join :: Nat (Compose F F) F
liftA2 :: Nat (Day F F) F

而這兩個類型看起來有點像是 F otimes F	o F 的形式。

我們還有 return 和 pure。等效於:

pure :: Nat Identity F

其中,

newtype Identity a = Identity a

好。現在看一下 Monoid (category theory) 的開頭(Examples 以前)


推薦閱讀:

Haskell中的範疇之函子和自然變換
C++中的函數對象(Function Object)為什麼叫函子(Functor)?
學過Haskell是一種怎樣的體驗?
GHC擴展-XRankNTypes是什麼?如何理解forall .?

TAG:Haskell | 範疇論 | 編程語言理論 |