色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

如何定義Monad

錢斌斌2年前17瀏覽0評論

如何定義Monad?

Monad

A monad is just a monoid in the category of endofunctors

the category of endofunctors是自函子endofunctor的范疇(category),Monad是自函子范疇中的Monoid。

前面我們已經了解函子的映射原理,自函子可以理解為映射范疇C到另外一個范疇C。那么自函子的范疇是什么意思?是基于自函子的新范疇嗎?經過查詢此句原出處: Here it is in context,原文是:

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.

確實是基于范疇X的新范疇,這個新范疇看成是endofunctors on X。范疇X之上的范疇,這個新范疇的元素對象是自函子endofunctor,談到范疇就要想到元素對象和態射,那么其態射是什么呢?

前面我們解釋函子funtor工作原理時,有一句:"3.壓平這兩層集合,組合所有的結果",這個組合方式是一種自然變換natural transformation,屬于新范疇的態射,因為態射有份兩種:組合態射和元identitiy,自然變化就要對分別對X范疇中這兩種進行轉換。

所以,Monad工作原理包含兩個部分:對原范疇組合成新的范疇,這個范疇對于Monad來說必須是幺半群Monoid,可以認為Monad是一系列自函子的組合,這種組合是一種轉換,轉換的結果是Monoid。

Monad有以下特征:

Monad是一種定義將函數(函子)組合起來的結構方式。(monoid是定義元素對象組合起來的結構方式。如果元素對象是特殊種類:函數(函子),那么它可能是Monad)這些組合的方法都是符合結合律的有一個特殊幺元,能夠和任何元素組合,導致的結果是不改變這些元素。

關鍵對最后一點幺元講解一下,以為什么需要Monad?一文中案例為說明,假設有兩個數字a和b相加,這里a和b 可能為空,Java 代碼如下:

int try_to_add_numbers( Integer a, Integer b ) { return a + b; }

如果a 和b非空,那么這個方法將會返回它們的總數,但是如果其中有一個是空的,我們會得到NullPointerException錯誤,調用客戶端得到這個錯誤必須去處理它。而函數的定義是有一個輸入類型和一個輸出類型,現在又跑出第三種類型Exception,很顯然Exception是和輸入輸出類型不屬于同一個范疇,這就不符合封閉運算了。

那么我們使用一個幺元,比如Optional來封裝結果,這樣就能保證不拋出Exception,而是將Exception錯誤通過輸出結構輸出,這種結果分兩種,要么是空,要么是有值,如果是有值,打開它就能獲得真正的計算結果。我們使用Optional與結果值結合,但是不會改變這個結果值類型。具體可見: Java8中option實現Monad

總體來說:Monoid是元素對象的組合的范疇,如果這種元素對象是函數或函子(也可能是Pipe,這就復雜了去了 ),那么Monad是自函子的組合范疇,Monad也是一種特殊的Monoid子集。

如果你對大數據Hadoop等比較熟悉,map/reduce其實也是一個Monad。

最后我們用簡單大白話(不精確有助于理解)翻譯一下Monad的英文定義:A monad is just a monoid in the category of endofunctors,monad只不過也是一種特殊情況下的monoid,特殊在哪里呢?就是自己對自己進行轉換的集合而已。

java代碼值的定義,如何定義Monad