OT Chen · @ot32em
72 followers · 1143 posts · Server g0v.social

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。

#FP筆記

Last updated 3 years ago

OT Chen · @ot32em
70 followers · 1133 posts · Server g0v.social

#FP筆記

Last updated 3 years ago

OT Chen :ablobgrin: · @ot32em
70 followers · 1124 posts · Server g0v.social

動機 //

- 處理 "在物件階層之間的尋訪關係。

- 不是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 不一樣。

#FP筆記

Last updated 3 years ago

OT Chen :ablobgrin: · @ot32em
70 followers · 1109 posts · Server g0v.social

1.
[支援]
monoid M 要
-- mempty :: M
-- <> :: M -> M -> M

[遵守]
[[結合律]]:
a <> (b <> c) = (a <> b) <> c
[[單位元素]]: mempty
-- a <> mempty = a
-- mempty <> a = a

符合這兩條規則,就可以成爲 monoid 。

#FP筆記

Last updated 3 years ago

OT Chen :ablobgrin: · @ot32em
70 followers · 1109 posts · Server g0v.social

Free Monad?

1.
要支援 fmap
要支援 fmap|pure|<*>
要支援 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

Last updated 3 years ago

OT Chen :ablobgrin: · @ot32em
70 followers · 1108 posts · Server g0v.social

(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 。

#FP筆記

Last updated 3 years ago

OT Chen :ablobgrin: · @ot32em
70 followers · 1106 posts · Server g0v.social

Free Monad?

1.
要支援 fmap
要支援 fmap|pure|<*>
要支援 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

Last updated 3 years ago

OT Chen :ablobgrin: · @ot32em
70 followers · 1106 posts · Server g0v.social

Free Monad?

1. 要支援 fmap;
要支援 fmap|pure|<*>;
要支援 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

Last updated 3 years ago

OT Chen 🙈 🙉 🙊 · @ot32em
65 followers · 1000 posts · Server g0v.social


原來 list comprehensive 是一種 monad 的 syntax sugar啊。

#FP筆記

Last updated 3 years ago