理解看看 compose compose compose / (.) . (.)

- (.) :: (b -> c) -> (a -> b) -> (a -> c)
- fmap :: (a -> b) -> f a -> f b
- instance Functor ((->) r) where
   fmap = (.)
- (.).(.) :: (b -> c) -> (a1 -> a2 -> b) -> (a1 -> a2 -> c)
- fmap . fmap :: (a -> b) -> f (f1 a) -> f (f1 b)

f: 你好,我們是 a1 -> a2 -> b 。

b->c: 我 b -> c 想要改一下你們的 return type 啦。

f: 好啊,請由 fmap 大門進來。我們這裡都是 (-> f1 b) 的 functor,也就是 (-> a2 -> b) 的部門。

b->c: 幹 怎麼辦,不是 -> b ,而是 (-> a2 -> b) 啊

f1: 你傻啦,你都進了 f 的 fmap大門,你再進來一下我 f1 的 fmap 大門不就好了。

b->c: 對吼,對我來說,你 f1 記錄的是 -> a2 的 context 啦,我直接再走一次 fmap,bypass 就好啦。

f1: 對啦。你看,現在你套完我們 f1 的 fmap,f 部門的都變成 (-> f1 c) 或是 (-> a2 -> c) 啦

b->c: 真的NE,從 f 外面看,就已經是 a1 -> a2 -> c,神神的。

(.).(.) 的 fmap . fmap,可以想成連下兩層 a1->r 的 functor 的 fmap。第一次 bypass 掉 吃 a1 的 context,第二次 bypass 掉 吃 a2 的 context,就可以偷修 return type 啦。

Inspired by: http://adit.io/posts/2013-07-22-lenses-in-pictures.html

comments powered by Disqus