該如何理解Monad?

請問該如何理解Monad?我上網搜索到了一個定義是:自函子範疇中幺半群

幺半群我知道是什麼,範疇和自函子我也知道是什麼,可是它們放到一起我就不清楚了..

自函子範疇是指自涵子所在的範疇還是說以自涵子這個涵子為態射的範疇?

範疇的幺半群是指在以對象為元素構成的集合上定義(G, F)其中二元運算F是自涵子所構成的群嗎?

那麼我可以粗略的理解Monad是針對態射定義的二元運算嗎?例如存在一個實數加法群(R, +)和一個實數乘法群(R, *)根據乘法定義a * n = a1 + a2 + ... + an通過歸納法證明a * 1 = 1 * a = a那麼有1*a + 1*a = a * (1 + 1)可得a * 1 + a = a * 2可得a * 1 + a * 1 + a = a * 3因此對於任意a * n有a + a * (n - 1)=a + a + a * (n - 2) = a + ... + a*1=a + .. + a證畢

因此可見

運算+構成的a+b範疇是+:a + b → a + b

運算*構成的a*n範疇是*:a * n → a * n

可得+和*分別為對應範疇的自函子

但是通過上面的證明可得a+b與a*n在F上同構,可有

F:a + b → a * n

F":a * n → a + b

那麼可說F是a+b範疇與a*n範疇間的涵子

a*n範疇中二元運算*是一個二元函數但根據柯里化可以將z=*(x, y)分解成Currying: (x, y) → py * px其中更加嚴謹的數學定義為

*(x, y) = py(px(e))=z其中e為單位元

因此可將二元運算*分解成在範疇a*n中的態射複合h:px*py

涵子F可以將a + b範疇中的一個F『(h)映射到a * n範疇中的態射h

涵子F』可見將a * n範疇中Currying(*(x, y))映射到a + b範疇中的態射F『(Currying(*(x, y)))

顯而易見如果定義涵子P:a + b → a * n → a + b可簡化得P:a + b→a + b因此P是一個自涵子,以此可證明二元運算*和涵子F和F』可構成一個自涵子因為

P=F"*h*F

則可說二元運算*在自涵子P的範疇a+b上構成幺半群,因為二元運算*在乘法群(R, *)構成幺半群,而根據涵子F和F『可證明(R, *)與(R, +)同構,因此可得F(F』(*))→*=F(F"(h))→h和Currying(*(x, y))→F『(Currying(*(x, y)))→F『(h)證畢

所以在一個代數系統中

P(Currying((a + b), c)) = F"(pF(a + b) * pF(c))

根據(R, *)與(R, +)同構性可得

p(a + b) * pc

根據二元運算*的定義可得

p(a + b) * pc = (a + b) * c

因此可說二元運算*是一個相對於a + b的Monad

如果這就是Monad的話

然而反過來也可以將二元運算+證明為a * n中的Monad...

所以以上我對Monad的理解是否正確?像實數向量空間與複數域同構,那麼在實數向量空間中用複數的工具來解決問題是不是也是一種Monad的表現?

所以I/O Monad其實是,文件狀態+索引=read(文件狀態,索引)=數據,這樣一個函數嗎?。。。


真傳一張紙

All told, a monad in X is just a monoid in the category of endofunctors
of X, with product × replaced by composition of endofunctors and unit
set by the identity endofunctor.

引用自 Categories for the Working Mathematician - Saunders Mac Lane

在這裡Monoid就是么半群了, 很明白地揭示了一對一的對應關係, 函子結合對應代數乘法, 後來這段話被惡搞成

A monad is just a monoid in the
category of endofunctors, what"s the
problem?


  1. Hask(H):以 Haskell 類型為對象、完備函數為態射構成的範疇。
  2. H 上面可以定義各種各樣的自函子,還有它們的複合,比如T^2=Tcirc T:H
ightarrow H
  3. 函子之間可以定義自然變換,設F,G:H
ightarrow H,則自然變換eta:F
ightarrow G建立起 H 上每個對象 x 都伴隨的一個態射eta_x,滿足對任意f:x
ightarrow y(G f)eta_x=eta_y(F f)。顯然地,以自函子為對象,自然變換為態射可以構造一個範疇——就是所謂的「自函子範疇」。
  4. 那麼對函子 M,如果存在一個自然變換mu:M^2
ightarrow Meta:1_H
ightarrow M,使得它們保持結合律等「好」性質(結合律和單位律),那我們就定義了一個 Monad。注意到eta, mu以及結合律、單位律形式和幺半群的很相似,所以我們說「自函子範疇上的一個幺半群」。


monad就是張量範疇中的環

柏原正樹那本講得好


一種理解辦法是 monad 是特殊的 continuation


推薦閱讀:

學過Haskell是一種怎樣的體驗?
PureScript 是什麼?有什麼特性
精通 Haskell 是一種怎樣的體驗?
Haskell等語言中的模式匹配在C++中如何實現?
編程語言中的「組合性」是什麼意思?

TAG:編程 | 抽象代數 | 函數式編程 | Haskell | 範疇論 |