Monad Transformer
動機 //
處理 “簡化處理多個monad時的操作流程”。
像是在main function處理 Maybe時。在 IO的 do notation主場,你可能要再特別額外解開Maybe。就會有if isJust else 或是 case 的pattern matching掛在流程上。
如果引入了 Maybe的 monad transformer “MaybeT”。在 IO+ Maybe的兩個context下,也可以輕鬆封裝在 MaybeT 的 >>= 裡。
本人 //
Monad Transformer 比較沒有一個universal的 typeclass。通常會根據不同的typeclass 特化不同版本的 typeclass。畢竟疊加context的規則,自己才會知道。
在命名規則上,通常尾巴有額外帶一個大寫T的,就是for該monad版本的 monad transformer。
動機 //
- 處理 "在物件階層之間的尋訪關係。
- 不是OO的語言,但是操作多層巢狀起來就像OO一樣簡單。
結構 //
- Lens 的會帶着 (孩子->m孩子) 跟 (媽媽 -> m 媽媽) 的兩個 function。
- Lens 可以藉由 compose 做串聯。
- Lens 的參數分成兩大部分:(a) 階層關係 (b) 做什麼操作。
- (a) 的部分就是看 client 如何串聯。
- (b) 的部分就是看要 view/over/set
-- 如果 m=Const 孩子會變 view
-- 如果 m=Identify會變over/ set
-- 如果 over的 function 塞 const,會變set。
- Traversal' 是針對物件下含有陣列類型/複數個的children時的Lens。
- Traversal' 也是 Lens 的一種變形。Type長相跟 Lens 幾乎一樣。只有差在要求的 type constraint 不一樣。
1.
[支援]
monoid M 要
-- mempty :: M
-- <> :: M -> M -> M
[遵守]
[[結合律]]:
a <> (b <> c) = (a <> b) <> c
[[單位元素]]: mempty
-- a <> mempty = a
-- mempty <> a = a
符合這兩條規則,就可以成爲 monoid 。
Free Monad?
1.
#Functor 要支援 fmap
#Applicative 要支援 fmap|pure|<*>
#Monad 要支援 fmap|pure|<*>|>>=
可以看到越強的 typeclass,約束越大。
有沒有一個載體 M,可以讓你只有支援 fmap 的 Functor f。擺進去之後,M f 也可以有 Monad 的能力?
讓你的 Functor f,免費地(free) 獲得 Monad 的能力?
這個神祕的載體 M,就是 Free Monad。
2. 文章有提到一個 FreeMonad 的實作。是將 FreeMonad 以 List 遞迴的結構來建構。
`M f` 的 fmap|pure|>>=,可以只靠 (1) `M f` 本身的結構 加上 (2) f 的 fmap 來組裝起來。
3. 用到 M 的結構,來取代 f 要成爲 Monad 所需要的約束。
那麼你對 M f 的操作,都要繞一下 M 的結構,才能達到。 像是 Code 的 type 複雜度越來越複雜,後面的例子都看不懂了XD
#FP筆記 #Functor #Applicative #monad
(monad M, >=>) 是一個 monoid。
1.
[支援]
monoid M 要
-- mempty :: M
-- <> :: M -> M -> M
[遵守]
[[結合律]]:
a <> (b <> c) = (a <> b) <> c
[[單位元素]]: mempty
-- a <> mempty = a
-- mempty <> a = a
符合這兩條規則,就可以成爲 monoid 。
Free Monad?
1.
#Functor 要支援 fmap
#Applicative 要支援 fmap|pure|<*>
#Monad 要支援 fmap|pure|<*>|>>=
可以看到越強的 typeclass,約束越大。
有沒有一個載體 M,可以讓你只有支援 fmap 的 Functor f。擺進去之後,M f 也可以有 Monad 的能力?
讓你的 Functor f,免費地(free) 獲得 Monad 的能力?
這個神祕的載體 M,就是 Free Monad。
2. 文章有提到一個 FreeMonad 的實作。是將 FreeMonad 以 List 遞迴的結構來建構。
`M f` 的 fmap|pure|>>=,可以只靠 (1) `M f` 本身的結構 加上 (2) f 的 fmap 來組裝起來。
3. 用到 M 的結構,來取代 f 要成爲 Monad 所需要的約束。
那麼你對 M f 的操作,都要繞一下 M 的結構,才能達到。 像是 Code 的 type 複雜度越來越複雜,後面的例子都看不懂了XD
#FP筆記 #Functor #Applicative #monad
Free Monad?
1. #Functor 要支援 fmap;
#Applicative 要支援 fmap|pure|<*>;
#Monad 要支援 fmap|pure|<*>|>>=。
可以看到越強的 typeclass,約束越大。
有沒有一個載體 M,可以讓你只有支援 fmap 的 Functor f。擺進去之後,M f 也可以有 Monad 的能力?
讓你的 Functor f,免費地(free) 獲得 Monad 的能力?
這個神祕的載體 M,就是 Free Monad。
2. 文章有提到一個 FreeMonad 的實作。是將 FreeMonad 以 List 遞迴的結構來建構。
`M f` 的 fmap|pure|>>=,可以只靠 (1) `M f` 本身的結構 加上 (2) f 的 fmap 來組裝起來。
3. 用到 M 的結構,來取代 f 要成爲 Monad 所需要的約束。
那麼你對 M f 的操作,都要繞一下 M 的結構,才能達到。 像是 Code 的 type 複雜度越來越複雜,後面的例子都看不懂了XD
#FP筆記 #Functor #Applicative #monad