@@ -82,10 +82,68 @@ apply 到 View 上获得 React Component 一枚
8282let Mult = XMult .apply (View)
8383```
8484
85- 完整代码: https://www.webpackbin.com/bins/-KoGxSJ-3pOi4DicUvaq
85+ 完整代码: < https://www.webpackbin.com/bins/-KoGxSJ-3pOi4DicUvaq >
8686
8787<iframe src =" https://www.webpackbin.com/bins/-KoGxSJ-3pOi4DicUvaq " frameborder =" 0 " width =" 100% " height =" 500 " ></iframe >
8888
89+ ## Functor
90+
91+ 想象一下以前构造出来的 ReactComponent, 一旦构造出来就不好修改或重用, 比如还是前面的例子, 你有一个 Mult 控件, 做的是乘法.
92+
93+ 那么如果我需要一个新的控件, 而且控件的也需要 ` a * b ` , 但是不同的是, 我们新控件的公式是 ` (a * b)^2 ` . 要是修改函数我们思路很清晰, 构造个新函数呗:
94+ ``` js
95+ function mmp (a , b ) {
96+ return mult (mult (a, b), mult (a, b))
97+ }
98+ ```
99+
100+ 如果是 React, 那就构造个 HoC 把 Mult 控件套进去呗.
101+
102+ 但是不管是包函数还是包 React 控件, 都不是一个可持续组合的方式, 而且构造新的 React Class 又会需要很多啰嗦的模板代码, 如果你经常写 React 你知道我在说什么.
103+
104+ Functor 可以免去这些复杂的过程, 而且提供了高可重用与组合的可能.
105+
106+ 接着 ` XMult ` , 我们很容易能将其变换成 ` XMMP `
107+
108+ ``` js
109+ let XMMP = XMult .map ((s ) => ({output: s .output * s .output }))
110+ ```
111+
112+ 这样我们就轻松从 XMult 生成一个新的 FantasyX, 在之前的基础上平方一下.
113+
114+ 这就像操作数据一样简单 不是吗
115+
116+ ``` js
117+ [1 ,2 ,3 ].map (x => x* x)
118+ // [2,4,6]
119+ ```
120+
121+ 完整代码: < https://www.webpackbin.com/bins/-Kss6m5ORK74CObhAPqB >
122+
123+ <iframe src =" https://www.webpackbin.com/bins/-Kss6m5ORK74CObhAPqB " frameborder =" 0 " width =" 100% " height =" 500 " ></iframe >
124+
125+ ## Monoid
126+
127+ 有了变换, 我们可能还需要合并两个 FantasyX, 比如上面的 XMMP 和 XMult, 如果我需要一个同时能具有两种行为的 FantasyX
128+
129+ ``` js
130+ let XCOMBINE = XMMP .concat (XMult)
131+ ```
132+
133+ 仅此, 我们就得到了一个同时具有 XMMP 与 XMult 行为的 FantasyX
134+
135+ 当然, 因为他们都会修改 ` state.output ` , 合并到一起会导致冲突, 我们稍微修改下 XMMP
136+
137+ ``` js
138+ let XMMP = XMult .map ((s ) => ({output2: s .output * s .output }))
139+ ```
140+
141+ 这样 View 就可以把 XMMP 和 Mult 的输出都显示出来
142+
143+ 完整代码: < https://www.webpackbin.com/bins/-Kss6m5ORK74CObhAPqB >
144+
145+ <iframe src =" https://www.webpackbin.com/bins/-Kss6m5ORK74CObhAPqB " frameborder =" 0 " width =" 100% " height =" 500 " ></iframe >
146+
89147## Summary
90148
91149 使用 FantasyX, 我们很简单将逻辑从 UI 中分离
0 commit comments