We explore our first stateful transaction, by devising a means to echo our state value into the resultant for independent modification. With our state value in the resultant, we explore using mapto lift functions into our type as a means to modify the resultant.

In our exploration we find that not only can we change values of the resultant, but we can change the type as needed. We also find that we can combine subsequent map calls into function compositions, allowing us to clean up our code and combine our mappings to avoid excessive interactions with our State datatype.

To wrap it all up, we take a look at a handy State construction helper called get that we can use to query the state into resultant. This allows to read from our state for computations that are based on the value of a given state.

const { curry, compose, Pair, State, mapProps, composeK } = require("crocks");

const { get } = State;

// State s a
// We define State as a fixed type of state 's' or the left and a variable 'a' on the right
// (s -> (a, s))
// State Unit defined as Pair(a, s) with 'a' variable on the left and 's' on the right // add :: Number -> Number -> Number
const add = x => y => x + y; // pluralize :: (String, String) -> Number -> String
const pluralize = (single, plural) => num => `${num} ${Math.abs(num) === 1 ? single : plural}`; // getState :: () -> State s
const getState = () => State(s => Pair(s, s)) // makeAwesome :: Number -> String
const makeAwesome = pluralize('Awesome', 'Awesomes') // flow :: Number -> String
const flow = compose(
makeAwesome,
add(10)
)
console.log(
getState()
.map(flow)
.runWith(2)
.fst()
)

Get state constructor is so common, there is well made function call 'get' to replace our 'getState':

const { curry, compose, Pair, State, mapProps, composeK } = require("crocks");

const { get } = State;

// State s a
// We define State as a fixed type of state 's' or the left and a variable 'a' on the right
// (s -> (a, s))
// State Unit defined as Pair(a, s) with 'a' variable on the left and 's' on the right // add :: Number -> Number -> Number
const add = x => y => x + y; // pluralize :: (String, String) -> Number -> String
const pluralize = (single, plural) => num => `${num} ${Math.abs(num) === 1 ? single : plural}`; // makeAwesome :: Number -> String
const makeAwesome = pluralize('Awesome', 'Awesomes') // flow :: Number -> String
const flow = compose(
makeAwesome,
add(10)
)
console.log(
get()
.map(flow)
.runWith(2)
.fst()
)

最新文章

  1. dsp28377控制DM9000收发数据——第三版程序,通过外部引脚触发来实现中断接受数据,优化掉帧现象
  2. WInform关闭程序的几种方法以及区别。
  3. Jquery Mobile 动态添加元素然后刷新 转
  4. Linux常用指令---$PATH (环境变量)
  5. hiho 第117周 二分图多重匹配,网络流解决
  6. ios中怎么样转行大小写
  7. 关于STM32下载问题的简单理解
  8. Java总结之容器
  9. HDU 1164 Eddy's research I【素数筛选法】
  10. 2.如何搭建MQTT环境
  11. webpack最简示例
  12. python之requests模块快速上手
  13. (转) Ensemble Methods for Deep Learning Neural Networks to Reduce Variance and Improve Performance
  14. C# 简单线程实例
  15. Ubunt 使用Virtualbox虚拟机NAT无法上网解决办法
  16. Linux命令----su(切换用户)以及passwd(修改用户密码)
  17. vector源码1(参考STL源码--侯捷):源码
  18. libxml2在mingw下编译
  19. flask模块
  20. windows 进程监控 Procmon.exe

热门文章

  1. String、ANSIString、PChar及TBytes之间的转换 BytesOf move stringof
  2. mysql绿色版配置
  3. python-函数(命名空间、作用域、闭包)
  4. head first (二):观察者模式
  5. spark热点互动问答
  6. 山东省第六届省赛 H题:Square Number
  7. 9Andrew.S.Tanenbaum计算机网络第三版读书笔记-总体概览
  8. python3开发进阶-Django框架的详解
  9. 输入参数之POJO包装类
  10. Android中的动态字符串的处理