Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Functional Programming 為什麼常常跟一個叫 monad 的東西綁在一起呢?
- # 1
- FP 想要 purely function,不喜歡 side-effect,但是現實中就是有 side effect。FP 建立了一種會員制的 Club,任何有遇到 side effect 的計算,沒關係,我們把當中 pure 的成分讓他們進入 Club,其他有 side effect 的成份,先讓圍事讓他們在 Club 外面排隊等。至少我們在 Club 內部,可以宣稱全部是 pure 的。
- 這種會產生 side-effect 而要建立 Club 機制的計算,我們先把它筆記成 C 語言的 function 形式
- Club (ReturnType) func(InputData arg);
- 再稱把登記會員這個動作叫做 **lift**,提升資格的意思。
- 有時候又會稱它叫 **pure**(x),把普通人升級成只有 **pure **的 **Club 會員**。
- # 2.
- 當你想繼續算下去時,發現你的其他計算過程其實並不是設計給 Club 會員用的,而是單純吃一般資料再吐一般資料,像是上面的 `func `是吃 `InputData` 而不是吃`Club(InputData)`。
- 舉個例子
- `ReturnType func2(InputData arg);`
- 這個時候有些 Club 比較厲害,有**警衛室**可以**代收這種計算過程**,幫你跟裡面的人講,大家把自己代一代,再把結果代為傳出來。
- `Club(ReturnType) GuardOffice(Club(InputData), func2, arg);`
- 有像這樣設立警衛室這樣子的 Club 很棒,我們會叫這種 Club 為 **Functor**。
- 而警衛室的功能呢,用一個比較廣義的詞,叫 `fmap` ,代表
- 我幫你的` f/(function)`,來去 `map/(把自己代一代)` 裡面的會員
- # 3.
- 有了警衛室的功能後,你會想,哇。那這樣我就可以請警衛幫我代收一堆 PCHome 的包裹嗎,不是,是一堆計算過程,像是
- GuardOffice(GuardOffice(GuardOffice ( func1(InputData), func2, arg), func3, arg), func4, arg)...
- 沒錯!
- 但是你會發現這些 `func3`, `func4 `一定要是無會員機制的計算過程,否則因為**警衛室**只是單純幫你代為套用。上面的結果會變成:
- Club(Club(Club(x)));
- Club 中又有 Club,之中又再有 Club。我們不想到李奧納多的冰天雪地那層,只要第一層的城市槍戰就好。
- 當初建立會員制的目的,只是想要簡單一層的 Club 來幫我們隔離 side effect,並不需要這麼多層的來描述 ,我們並不 care。於是在競爭激烈的社會下,更棒的 Club 推出**高等警衛室**。
- 不管是在第一層 Club 外面排隊的 side effect ,還是在第二層 Club 外面排隊的 side effect,我們通通都把他趕到最外面那層。我們只想要說 Club 內部是純 pure,其他的我們不管。
- 使得
- `using ClubAwarenessFuncT = Club<ReturnType>(InputData);`
- `Club(ReturnType) PrimeGuardOffice(Club(InputData), ClubAwarenessFuncT, arg);`
- 於是
- `PrimeGuardOffice(PrimeGuardOffice(GuardOffice ( func1(InputData), func2, arg), func3, arg), func4, arg)...`
- 可以給你好棒棒的 `Club(x)` 結果。
- 這種推出**高等警衛室**功能 Club ,我們稱他為 Monad 。
- **高等警衛室**的功能我會會叫 flatMap,意思表示,在將 function 套用 (/map),並把他產生出來的 side effect 趕到外面,跟外面在排隊的 side effect 排成只有一個隊伍(/flat)。
- # 4.
- 當有了 Monad Club ,我們可以把所有一般 function (像*func2*) ,跟有 side effect 的 function 像 *func3 *跟 *func4 *),都能以 purely function 的方式串聯起來。那些如何隔離 side effect 的機制,都交由 **高等警衛室**與**一般警衛室**來去來處理。
- 有時候我們懷疑我們用的 **Club** 跟**警衛室**,當我在 Club 內做運算,跟在Club 外做結果,**是不是等價不變的**? 我們會定下**對應關係要符合我們預期**的規則。剛好跟群論裡的談到 **Monad** 性質一樣,所以才會以他的名字命名。
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement