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