使用 alt() 提早處理 Nothing
栏目: JavaScript · 发布时间: 6年前
内容简介:當使用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?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web Designer Idea
梁景红 / 电子工业出版社 / 2006年 / ¥55.00
这是一本以“目的、信息、设计、创意”作为根脉的关于网页视觉的书籍,畅谈的话题从策划到编辑再到设计,从而讨论“我们要建立怎样的站点,并以何种形式完成它”的问题。 全书共分四个部分,分别是网站建设目的,网站信息内容,页面形式设计,网页创作构思。 四部分有机地结合,形成一个统一的整体。“目的”部分以建设网站的目的为主,带领设计师从建站目的的角度,探讨如何抓住首要问题;如何建立网站雏形;如何打开狭隘的、局......一起来看看 《Web Designer Idea》 这本书的介绍吧!