使用 alt() 提早處理 Nothing
栏目: JavaScript · 发布时间: 5年前
内容简介:當使用VS Code 1.33.1Quokka 1.0.209
當使用 Maybe
後, Nothing
都交由使用端的 option()
處理,但有時候我們想在 Function 內提早處理 Nothing
,此時可使用 alt()
。
Version
VS Code 1.33.1
Quokka 1.0.209
Ramda 0.26.1
Maybe
import { isString, and, not, isEmpty, prop } from 'crocks'; import { compose, join, split, toLower, concat } from 'ramda'; // createUrlSlug :: String -> String let createSlug = compose(join('-'), split(' '), toLower); // appendSlug :: String -> String let appendSlug = concat('https://oomusou.io/crocks/'); // createUrl :: String -> String let createUrl = compose(appendSlug, createSlug); let data = { title: 'FP in JavaScript', price: 100, }; // fn :: Object -> Maybe String let fn = obj => prop('title', obj) .map(createUrl); fn(data).option('https://oomusou.io'); // ?
13 行
let data = { title: 'FP in JavaScript', price: 100, };
我們希望將 data.title
轉成 https://oomusou.io/crocks/fp-in-javascript
的 url 格式。
18 行
// fn :: Object -> Maybe String let fn = obj => prop('title', obj) .map(createUrl);
Crocks 的 prop()
回傳為 Maybe
,使用 map()
傳入實際處理 url 為 createUrl()
。
11 行
// createUrl :: String -> String let createUrl = compose(appendSlug, createSlug);
createUrl()
組合了 createSlug()
與 appendSlug()
。
第 4 行
// createUrlSlug :: String -> String let createSlug = compose(join('-'), split(' '), toLower);
createSlug()
組合了 toLower()
、 split()
與 join()
,負責將 FP in JavaScript
轉成 fp-in-javascript
。
第 7行
// appendSlug :: String -> String let appendSlug = concat('https://oomusou.io/crocks/');
appendSlug()
將 fp-in-javascript
組合成 https://oomusou.io/crocks/fp-in-javascript
。
22 行
fn(data).option('https://oomusou.io'); // ?
由於 fn()
回傳為 Maybe
,最後使用 option()
轉回 string,若為 Nothing
,則顯示 https://oomusou.io/
。
chain()
import { isString, and, not, isEmpty, prop, safe } from 'crocks'; import { compose, join, split, toLower, concat } from 'ramda'; // isNonEmptyString :: a -> Boolean let isNonEmptyString = and(not(isEmpty), isString); // createUrlSlug :: String -> String let createSlug = compose(join('-'), split(' '), toLower); // appendSlug :: String -> String let appendSlug = concat('https://oomusou.io/crocks/'); // createUrl :: String -> String let createUrl = compose(appendSlug, createSlug); let data = { title: '', price: 100, }; // fn :: Object -> Maybe String let fn = obj => prop('title', obj) .chain(safe(isNonEmptyString)) .map(createUrl); fn(data).option('https://oomusou.io'); // ?
需求改變,希望若 title
不存在,或者 title
為 empty string,都顯示成 https://oomusou.io/crocks/page-not-found
。
也就是 Nothing
不能再由使用端處理,必須在 fn()
就處理成 page-not-found
。
16 行
let data = { title: '', price: 100, };
data.title
特別改成 empty string。
21 行
// fn :: Object -> Maybe String let fn = obj => prop('title', obj) .chain(safe(isNonEmptyString)) .map(createUrl);
加上了 safe(isNonEmptyString)()
判斷是否為 empty string,但由於 safe()
也是回傳 Maybe
,為了避免兩層 Maybe
,特別使用了 chain()
攤平,然後繼續原來的 map(createUrl)
。
由於 empty string 為 Nothing
,最後顯示為 https://oomusou.io
,但我們需求是顯示 https://oomusou.io/crocks/page-not-found
,很明顯與需求不合。
alt()
import { isString, and, not, isEmpty, prop, safe, Maybe } from 'crocks'; import { compose, join, split, toLower, concat } from 'ramda'; let { of } = Maybe; // isNonEmptyString :: a -> Boolean let isNonEmptyString = and(not(isEmpty), isString); // createUrlSlug :: String -> String let createSlug = compose(join('-'), split(' '), toLower); // appendSlug :: String -> String let appendSlug = concat('https://oomusou.io/crocks/'); // createUrl :: String -> String let createUrl = compose(appendSlug, createSlug); let data = { title: '', price: 100, }; // fn :: Object -> Maybe String let fn = obj => prop('title', obj) .chain(safe(isNonEmptyString)) .alt(of('page-not-found')) .map(createUrl); fn(data).option('https://oomusou.io'); // ?
23 行
// fn :: Object -> Maybe String let fn = obj => prop('title', obj) .chain(safe(isNonEmptyString)) .alt(of('page-not-found')) .map(createUrl);
因為 chain(safe(isNonEmptyString))
可能回傳 Nothing
,很明顯不能再交給使用端處理,而要在 fn()
提早處理 Nothing
。
使用了 alt()
,當 Maybe
為 Nothing
時,使用傳入 alt()
的新 Maybe
取代, of()
會將任意值轉成 Maybe
,也就是我們即將把 page-not-found
塞進 Maybe
。
最後繼續使用原來的 map(createUrl)
。
alt()
Maybe a ~> Maybe a -> Maybe a
當 Maybe
為 Nothing
時,以 alt()
傳入的 Maybe
取代之
Maybe a
:data 為 Maybe
Maybe a
:當 Maybe
為 Nothing
時,以新的 Maybe
取代
Maybe b
:回傳新的 Maybe
使用端寫法完全不變,但已經顯示 https://oomusou.io/crocks/page-not-found
,因為 alt()
在 fn()
內提前處理了 Nothing
。
以上所述就是小编给大家介绍的《使用 alt() 提早處理 Nothing》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 人工智能可以分析地球磁场变化 提早预测地震和海啸
- RecyclerView使用指南(一)—— 基本使用
- 如何使用Meteorjs使用URL参数
- 使用 defer 还是不使用 defer?
- 使用 Typescript 加强 Vuex 使用体验
- [译] 何时使用 Rust?何时使用 Go?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
互联网浪尖上的女性
田玉翠 / 人民出版社 / 2017-1 / 68.00
二十三个真实、前沿的女性创业者实例,带你走进“她世界”洞悉“她经济”。《互联网浪尖上的女性》不仅仅关于创业,更是关于女性如何追逐自己的梦想,让人生更丰满、更精彩。一起来看看 《互联网浪尖上的女性》 这本书的介绍吧!