由於 State 原本可以一篇写完的,被我拖成四篇的关系,所以来回顾一下,哈哈哈哈哈哈
这是我们的前几章实作的 State Monad
const State = (run) => ({
run,
map: (f) =>
State((a) => {
const [y, s] = run(a);
return [f(y), s];
}),
chain: (f) =>
State((x) => {
const [y, s] = run(x);
return f(y).run(s);
}),
ap: (m) =>
State((x) => {
const [y, s] = run(x);
return m.map(y).run(s);
}),
});
State.of = a => State(s => [a, s])
今天来介绍一下 State Monad 的 Helper function
get
就像是 Reader Monad 的 ask
一样, 我们也可以从 State 取值,就会变成 State s s
// State.get :: () -> State s s
State.get = () => State(x => [x, x])
const data = { address: { postal_code: 123 } };
const getCode = (prop) => prop.address.postal_code || 0;
State.get()
.map(getCode)
.run(data); // [123,{"address":{"postal_code":123}}]
modify
也可以修改的 State 的状态
// State.modify :: (s -> s) -> State s ()
State.modify = f => State(s => [null, f(s)])
还记得在 Lenses 那章有提到如何用 immutable 的方法操纵物件吗?
如果现在要让一个物件里的目标资料进行修改要如何做呢???
没错,大家应该都想到了
const mapProps = (target, func) => R.over(R.lensPath(target), func);
这样就可以用 mapProps
修改我们 data
这个状态了
State
.modify(mapProps(['address', 'postal_code'], R.add(10)))
.run(data); // [null,{"address":{"postal_code":133}}]
put
最後可以更新 State 的状态!
State.put = x => State(s => [null, x])
我们要创建一个 reset
函式,直接用 "missing :))))))"
取代现有的状态
const reset = () => State.put("missing :))))))");
现在我们就可以将使用 reset
更新现有状态
State.get().map(getCode).chain(reset).run(data); // [null,""]
明天就是最後一天了,最後一天了,最後一天了,真的要完赛了 QAQ 感动耶
感谢大家阅读!!!!!!!!!
工商时间: 未来会不定期更新,但会放在笔者的部落格 :) Happy Coding!
D13. 基础题3n+1跟进阶3n+1(Uva100) 3n+1是很基本的练习题目,题目大致上是输入...
不怎麽重要的前言 上一篇我们介绍了一个满好用的函式库,只要知道怎麽使用math.h的很多函式,都可以...
昨天我们完成了虚拟环境安装,而为了让後续的挑战更具连贯性,对於後面几个主题的顺序有稍作挑整,故从今天...
前言 JS 30 是由加拿大的全端工程师 Wes Bos 免费提供的 JavaScript 简单应用...
键盘钢琴 ( 音符动画 ) 教学原文参考:键盘钢琴 ( 音符动画 ) 这篇文章会介绍,如何在 Scr...