教科書級別的完美回答-感謝大神

「 劉穎: 問你個問題,看你這scala老手多長時間給出答案?

List(Some(3), None).flatMap(e => e)

的結果是什麼? 爲什麼? 」


今天走在路上,忽然想到上次你說的這個問題可以從語言上層的理論來解釋:
在面向對象的編程中,一切皆對象,類比到函數式編程,一切皆函數,也可以稱爲一切皆monad,也就是說我們在函數式編程中見到的應該都是monad(除去基本類型)。monad的嚴格定義是:自函子範疇內的幺半羣。這句話中有兩個比較重要的地方:
1、自函子:函數的定義域和值域在同一個範圍內(也正因爲這樣我們纔可以在函數式編程中使用鏈式調用)
2、幺半羣:幺半羣要拆開來看,首先是羣的概念,所謂羣就是滿足“結合率”和“交換律”的集合,半羣就是隻滿足結合率的集合,而“幺”則是指這個集合中存在一個幺元。

針對幺半羣可以舉一個例子:假設集合中存在a、b、c和一個函子*,半羣意味着a * b * c = a * (b * c) = (a * b) * c,這一個在monad with cats中我記得應該是有大量的基於此推導出來的公式的。現在集合中還存在一個幺元:I,幺元滿足的特性是 a * I = I * a = a。上面這個是理論,用個通俗點的例子來說明:存在一個字符串的集合 {“hello”, “world”, “!”, “”},那麼append就是一個能使該集合滿足單子特定的函子。演示一下結合率:“hello”.append(“wold”).append("!") = “hello”.append(“world”.append("!")) = (“hello”.append(“world”)).append("!"),在看一下幺元的特性:"".append(“hello”) = “hello”.append("") = “hello”。
回到上面的例子Some(3)和None都是集合中的元素,而flatMap則是集合的一個函子,這裏的None應該就是monad中的幺元,所以上面的結果List(Some(3),None).flatMap(e => e) “equals” List(None, Some(3)).flatMap(e => e) “equals” List(Some(3)).flatMap(e => e)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章