[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. 即 ...
随机推荐
- Scala具体解释---------类
Scala中的类 摘要: 在本篇中.你将会学习怎样用Scala实现类. 假设你了解Java或C++中的类,你不会认为这有多难.而且你会非常享受Scala更加精简的表示法带来的便利.本篇的要点包含: 1 ...
- Android Cordova 插件开发之编写自己定义插件
前言 本文适合Android+web的复合型人才,由于cordova本身就是混合开发,所以在Android开发的基础上,还要懂web相关技术(HTML+CSS+JS).可是也有例外,比方我.仅仅需负责 ...
- [NOI.AC#35]string 缩点+拓扑排序
链接 因为有交换相邻字母,因此给你字符串就相当于给你了这个字符串的所有排列 把等价的串映射到整数范围,再根据 \(m\) 种魔法连边,缩点后在 DAG 上DP即可 无耻地用了int128 #inclu ...
- 37.Intellij IDEA解决GBK乱码
转自:https://blog.csdn.net/myspacedemen/article/details/38401047 今天尝鲜装完Intellij IDEA以后,打开一个GBK编码的页面,华丽 ...
- POJ3622 Gourmet Grazers(FHQ Treap)
Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 2363 Accepted: 881 Description Like s ...
- 18/9/16牛客网提高组Day2
牛客网提高组Day2 T1 方差 第一眼看就知道要打暴力啊,然而并没有想到去化简式子... 可能因为昨晚没睡好,今天上午困死 导致暴力打了一个半小时,还不对... #include <algor ...
- [TS] Implement a doubly linked list in TypeScript
In a doubly linked list each node in the list stores the contents of the node and a pointer or refer ...
- LocationOnScreen-控件在手机屏幕中的位置坐标
我们可以通过如下的方法获得某个控件在屏幕中的绝对坐标 代码如下: private int[] mHistoryDisplayButtonLocation; private int mHistoryDi ...
- Mahjong tree (hdu 5379 dfs)
Mahjong tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tot ...
- [React] Theme your application with styled-components and "ThemeProvider"
In this styled-components lesson, we set a "primary color" within a UI "theme" o ...