Advertisement
Guest User

Untitled

a guest
Mar 26th, 2017
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.87 KB | None | 0 0
  1. Functional Programming 為什麼常常跟一個叫 monad 的東西綁在一起呢?
  2.  
  3.  
  4. # 1
  5. FP 想要 purely function,不喜歡 side-effect,但是現實中就是有 side effect。FP 建立了一種會員制的 Club,任何有遇到 side effect 的計算,沒關係,我們把當中 pure 的成分讓他們進入 Club,其他有 side effect 的成份,先讓圍事讓他們在 Club 外面排隊等。至少我們在 Club 內部,可以宣稱全部是 pure 的。
  6.  
  7.  
  8. 這種會產生 side-effect 而要建立 Club 機制的計算,我們先把它筆記成 C 語言的 function 形式
  9.  
  10.  
  11.  
  12. Club (ReturnType) func(InputData arg);
  13.  
  14.  
  15.  
  16. 再稱把登記會員這個動作叫做 **lift**,提升資格的意思。
  17.  
  18. 有時候又會稱它叫 **pure**(x),把普通人升級成只有 **pure **的 **Club 會員**。
  19.  
  20.  
  21.  
  22.  
  23.  
  24. # 2.
  25. 當你想繼續算下去時,發現你的其他計算過程其實並不是設計給 Club 會員用的,而是單純吃一般資料再吐一般資料,像是上面的 `func `是吃 `InputData` 而不是吃`Club(InputData)`。
  26.  
  27. 舉個例子
  28.  
  29.  
  30.  
  31. `ReturnType func2(InputData arg);`
  32.  
  33.  
  34.  
  35. 這個時候有些 Club 比較厲害,有**警衛室**可以**代收這種計算過程**,幫你跟裡面的人講,大家把自己代一代,再把結果代為傳出來。
  36.  
  37.  
  38.  
  39. `Club(ReturnType) GuardOffice(Club(InputData), func2, arg);`
  40.  
  41.  
  42.  
  43. 有像這樣設立警衛室這樣子的 Club 很棒,我們會叫這種 Club 為 **Functor**。
  44.  
  45. 而警衛室的功能呢,用一個比較廣義的詞,叫 `fmap` ,代表
  46.  
  47. 我幫你的` f/(function)`,來去 `map/(把自己代一代)` 裡面的會員
  48.  
  49.  
  50.  
  51. # 3.
  52.  
  53. 有了警衛室的功能後,你會想,哇。那這樣我就可以請警衛幫我代收一堆 PCHome 的包裹嗎,不是,是一堆計算過程,像是
  54.  
  55.  
  56.  
  57. GuardOffice(GuardOffice(GuardOffice ( func1(InputData), func2, arg), func3, arg), func4, arg)...
  58.  
  59.  
  60.  
  61. 沒錯!
  62.  
  63.  
  64.  
  65. 但是你會發現這些 `func3`, `func4 `一定要是無會員機制的計算過程,否則因為**警衛室**只是單純幫你代為套用。上面的結果會變成:
  66.  
  67.  
  68.  
  69. Club(Club(Club(x)));
  70.  
  71.  
  72.  
  73. Club 中又有 Club,之中又再有 Club。我們不想到李奧納多的冰天雪地那層,只要第一層的城市槍戰就好。
  74.  
  75.  
  76.  
  77. 當初建立會員制的目的,只是想要簡單一層的 Club 來幫我們隔離 side effect,並不需要這麼多層的來描述 ,我們並不 care。於是在競爭激烈的社會下,更棒的 Club 推出**高等警衛室**。
  78.  
  79. 不管是在第一層 Club 外面排隊的 side effect ,還是在第二層 Club 外面排隊的 side effect,我們通通都把他趕到最外面那層。我們只想要說 Club 內部是純 pure,其他的我們不管。
  80.  
  81.  
  82.  
  83. 使得
  84.  
  85. `using ClubAwarenessFuncT = Club<ReturnType>(InputData);`
  86.  
  87. `Club(ReturnType) PrimeGuardOffice(Club(InputData), ClubAwarenessFuncT, arg);`
  88.  
  89.  
  90.  
  91. 於是
  92.  
  93.  
  94.  
  95. `PrimeGuardOffice(PrimeGuardOffice(GuardOffice ( func1(InputData), func2, arg), func3, arg), func4, arg)...`
  96.  
  97.  
  98.  
  99. 可以給你好棒棒的 `Club(x)` 結果。
  100.  
  101.  
  102.  
  103. 這種推出**高等警衛室**功能 Club ,我們稱他為 Monad 。
  104.  
  105. **高等警衛室**的功能我會會叫 flatMap,意思表示,在將 function 套用 (/map),並把他產生出來的 side effect 趕到外面,跟外面在排隊的 side effect 排成只有一個隊伍(/flat)。
  106.  
  107.  
  108.  
  109. # 4.
  110. 當有了 Monad Club ,我們可以把所有一般 function (像*func2*) ,跟有 side effect 的 function 像 *func3 *跟 *func4 *),都能以 purely function 的方式串聯起來。那些如何隔離 side effect 的機制,都交由 **高等警衛室**與**一般警衛室**來去來處理。
  111.  
  112.  
  113.  
  114. 有時候我們懷疑我們用的 **Club** 跟**警衛室**,當我在 Club 內做運算,跟在Club 外做結果,**是不是等價不變的**? 我們會定下**對應關係要符合我們預期**的規則。剛好跟群論裡的談到 **Monad** 性質一樣,所以才會以他的名字命名。
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement