Day 29 - State Monad IV

Review

由於 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 感动耶 /images/emoticon/emoticon01.gif

感谢大家阅读!!!!!!!!!

工商时间: 未来会不定期更新,但会放在笔者的部落格 :) Happy Coding!


<<:  队列

>>:  Day 29 BERT

D13. 学习基础C、C++语言

D13. 基础题3n+1跟进阶3n+1(Uva100) 3n+1是很基本的练习题目,题目大致上是输入...

【从零开始的 C 语言笔记】第十三篇-Array介绍与应用(1)

不怎麽重要的前言 上一篇我们介绍了一个满好用的函式库,只要知道怎麽使用math.h的很多函式,都可以...

Day09 - 网站开发从Django开始

昨天我们完成了虚拟环境安装,而为了让後续的挑战更具连贯性,对於後面几个主题的顺序有稍作挑整,故从今天...

Day 2 - CSS + JS Clock

前言 JS 30 是由加拿大的全端工程师 Wes Bos 免费提供的 JavaScript 简单应用...

Day 14 ( 中级 ) 键盘钢琴 ( 音符动画 )

键盘钢琴 ( 音符动画 ) 教学原文参考:键盘钢琴 ( 音符动画 ) 这篇文章会介绍,如何在 Scr...