自函子的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
而這兩個類型看起來有點像是 的形式。
我們還有 return 和 pure。等效於:
pure :: Nat Identity F
其中,
newtype Identity a = Identity a
好。現在看一下 Monoid (category theory) 的開頭(Examples 以前)
推薦閱讀:
※Haskell中的範疇之函子和自然變換
※C++中的函數對象(Function Object)為什麼叫函子(Functor)?
※學過Haskell是一種怎樣的體驗?
※GHC擴展-XRankNTypes是什麼?如何理解forall .?