使用 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/

使用 alt() 提早處理 Nothing

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)

使用 alt() 提早處理 Nothing

由於 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() ,當 MaybeNothing 時,使用傳入 alt() 的新 Maybe 取代, of() 會將任意值轉成 Maybe ,也就是我們即將把 page-not-found 塞進 Maybe

最後繼續使用原來的 map(createUrl)

alt()

Maybe a ~> Maybe a -> Maybe a

MaybeNothing 時,以 alt() 傳入的 Maybe 取代之

Maybe a :data 為 Maybe

Maybe a :當 MaybeNothing 時,以新的 Maybe 取代

Maybe b :回傳新的 Maybe

使用 alt() 提早處理 Nothing

使用端寫法完全不變,但已經顯示 https://oomusou.io/crocks/page-not-found ,因為 alt()fn() 內提前處理了 Nothing


以上所述就是小编给大家介绍的《使用 alt() 提早處理 Nothing》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

光线跟踪算法技术

光线跟踪算法技术

萨芬 / 刘天慧 / 清华大学出版社 / 2011-3 / 98.00元

《光线跟踪算法技术》详细阐述了与光线跟踪问题相关的高效解决方案及相应的数据结构和算法,主要包括采样技术、投影视图、视见系统、景深、非线性投影、立体视觉、光照与材质、镜面反射、光泽反射、全局光照、透明度、阴影、环境遮挡、区域光照、光线与对象间的相交计算、对象变换、栅格技术以及纹理映射技术等内容。此外,《光线跟踪算法技术》还提供了相应的算法、代码以及伪代码,以帮助读者进一步理解计算方案的实现过程。 ......一起来看看 《光线跟踪算法技术》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具