[JS Compose] 2. Enforce a null check with composable code branching using Either
We define the Either type and see how it works. Then try it out to enforce a null check and branch our code.
Now, we try to make Box more useful. We want to do a force null check by define "Right" and "Left" tow boxes.
What "Right" does is, apply the logic passed in to the value Box has.
What "Left" does is, ingore the logic and just return the value.
const Right = x => ({
map: f => Right(f(x)),
toString: () => `Right(${x})`
});
const Left = x => ({
map: f => Left(x),
toString: () => `Left(${x})`
});
Example:
const res1 = Right().map(x => x + ).map(x => x / );
console.log(res1.toString()); // Right(2) const res2 = Left().map(x => x + ).map(x => x / );
console.log(res2.toString()); // Left(3)
The logic here we try to complete, is the function either call "Right" or "Left". To see a more useful case, we need to define our 'fold' function.
const Right = x => ({
map: f => Right(f(x)),
fold: (f, g) => g(x), // If Right, run function g
toString: () => `Right(${x})`
});
const Left = x => ({
map: f => Left(x),
fold: (f, g) => f(x), // If Left, run function f
toString: () => `Left(${x})`
});
Because in real case, we never know it is Right or Left get called, so in fold function, we defined two params, if it is Right get called, we will call second param g, if it is Left get called, we will call first param f.
How how about we build a function to find color, if the color is defined, we return its value, if not, we return "No color"!
const findNullable = x =>
x != null ? Right(x) : Left(null); const findColor = name =>
findNullable({red: "#ff0000", green: "#00ff00", blue: "#0000ff"}[name]); const res = findColor("blue")
.map(s => s.slice())
.fold(e => "no color found", s => s.toUpperCase()); console.log(res) //0000FF
const res = findColor("yellow")
.map(s => s.slice())
.fold(e => "no color found", s => s.toUpperCase());
console.log(res); // no color found
Now, if the color is found, then it log out the color value, if not found, then show the error message.
So let's think about it, what if we doesn't wrap findColor function into Box? For example, it looks like this:
const findColor = name =>
{red: "#ff0000", green: "#00ff00", blue: "#0000ff"}[name];
Then we do:
const findColor = name =>
{red: "#ff0000", green: "#00ff00", blue: "#0000ff"}[name]; const res = findColor("yellow").slice().toUpperCase();
console.log(res); // Error: cannot call .slice() on Undefined!
So the benefits we get from Right and Left is it help us do null checking. If it is Left, then it will skip all the map chain. Therefore we can keep our program safe.
[JS Compose] 2. Enforce a null check with composable code branching using Either的更多相关文章
- FindBugs:Compiler output path for module can not be null. check your module/project settings问题原因
这可能是很多人在使用Android studio 该插件会发现此错误信息:Compiler output path for module can not be null. check your mod ...
- js中的undefined与null、空值的比较
最近在修改一个项目,总是报Js错误: 无法获取属性“length”的值: 对象为 null 或未定义 点开调试之后,惊奇的发现markerArr的值是undefined 所以我就将代码改成如下形式: ...
- [转]JS基础之undefined与null的区别
在JavaScript开发中,被人问到:null与undefined到底有啥区别? 一时间不好回答,特别是undefined,因为这涉及到undefined的实现原理.于是,细想之后,写下本文,请各位 ...
- js判断undefined类型,undefined,null,NaN的区别
js判断undefined类型 今天使用showModalDialog打开页面,返回值时.当打开的页面点击关闭按钮或直接点浏览器上的关闭则返回值是undefined 所以自作聪明判断 ...
- js操作css样式,null和undefined的区别?
1.js操作css的样式 div.style.width="100px"在div标签内我们添加了一个style属性,并设定了width值.这种写法会给标签带来大量的style属性, ...
- js判断undefined类型,undefined,null, 的区别详细解析
js判断undefined类型 今天使用showModalDialog打开页面,返回值时.当打开的页面点击关闭按钮或直接点浏览器上的关闭则返回值是undefined所以自作聪明判断 var reVal ...
- 【JS Note】undefined与null
在Javascript中有这两种原始类型: Undefined与Null.而这两种原始类型都各自只有一个值,分别是undefined,null. undefined: 1.变量声明后未赋值,则变量会被 ...
- js中的undefined 和null
undefined是基本数据类型 表示未定义 缺少的意思 null是引用数据类型 是对象 表示空对象 undefined是从null派生出来的 所以undefined==null true Ja ...
- JS中的Undefined和Null的区别
Undefined ①在声明变量时,如果没有给变量赋值,则这个变量就是undefined类型: ②访问未声明的变量会报错误消息,但这样的变量使用 typeof 测试,返回的值为Undefined. 即 ...
随机推荐
- [NOI.AC#35]string 缩点+拓扑排序
链接 因为有交换相邻字母,因此给你字符串就相当于给你了这个字符串的所有排列 把等价的串映射到整数范围,再根据 \(m\) 种魔法连边,缩点后在 DAG 上DP即可 无耻地用了int128 #inclu ...
- BZOJ3926: [Zjoi2015]诸神眷顾的幻想乡(广义后缀自动机)
Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看. ...
- 微信小程序弹框提示绑定手环实例
今天想聊一聊小程序里面存在的一些逻辑问题,拿手上的这个小程序来说,(这个小程序是开发出来玩的,每个人手上有一个手环,带着手环时候的心率,运动步数,血压数据都会展现在这个小程序里面,一目了然)用户第一次 ...
- 【2017 Multi-University Training Contest - Team 7】Hard challenge
[Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6127 [Description] 平面上有n个点,每个点有一个价值,每两个点之间都有一条线段,定义 ...
- VBS 脚本调用
https://my.oschina.net/Tsybius2014/blog/602641
- Windows 共享无线上网 无法启动ICS服务解决方法(WIN7 ICS服务启动后停止)
Windows 共享无线上网 无法启动ICS服务解决方法(WIN7 ICS服务启动后停止) ICS 即Internet Connection Sharing,internet连接共享,可以使局域网上其 ...
- Flume Interceptors官网剖析(博主推荐)
不多说,直接上干货! Flume Sources官网剖析(博主推荐) Flume Channels官网剖析(博主推荐) Flume Channel Selectors官网剖析(博主推荐) Flume ...
- 使用solr的DIHandler 构建mysql大表全量索引,内存溢出问题的解决方法
solr官方给出的解决方式是: DataImportHandler is designed to stream row one-by-one. It passes a fetch size value ...
- react取消监听scroll事件
如果要移除事件addEventListener的执行函数必须使用外部函数而不能直接使用匿名函数 错误写法: // 这样写是移除不了滚动事件的 componentDidMount() { // 添加滚动 ...
- 洛谷——P2515 [HAOI2010]软件安装
https://www.luogu.org/problem/show?pid=2515#sub 题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中 ...