[Javascript Crocks] Apply a function in a Maybe context to Maybe inputs (curry & ap & liftA2)

Functions are first class in JavaScript. This means we can treat a function like any other data. This also means we can end up with a function as the wrapped value in a Maybe. The Maybe type gives us the ability to apply that wrapped function to other wrapped values, keeping both the value and the function in the safe confines of a Maybe.

The whole point is when we have params as safe params:

const safeNum1 = safe(isNumber, 1);
const safeNum2 = safe(isNumber, 2);

The function we need to opreate the params is not in a Maybe context:

const add = a => b => a + b;

Now we cannot just call 'add' function to add two Just(n) value together:

add(safeNum1, safeNum2) // doesn't work

Lucky we can also wrap function into Maybe context:

const safeAdd = Maybe.of(add);

We can use 'ap' function to apply context for a function

const crocks = require('crocks')
const { ap, safe, isNumber, Maybe } = crocks;

const safeNum1 = safe(isNumber, 1);
const safeNum2 = safe(isNumber, 2);

const add = a => b => a + b;

const res = Maybe.of(add)
    .ap(safeNum1)
    .ap(safeNum2);

console.log(res) // Just 3

We can improve the code by using 'curry' instead of 

const add = a => b => a + b;

to:

const crocks = require('crocks')
const { curry } = crocks;
const add = curry((a, b) => a + b);

We can also using a helper method 'liftA2' to replace calling 'ap' multiy times:

const res = Maybe.of(add)
    .ap(safeNum1)
    .ap(safeNum2);

to:

const crocks = require('crocks')
const { ap, safe, isNumber, Maybe, curry, liftA2 } = crocks;

const safeNum1 = safe(isNumber, 1);
const safeNum2 = safe(isNumber, 2);

const add = curry((a, b) => a + b);

const addTwoSafeNums = liftA2(add);
const res = addTwoSafeNums(safeNum1, safeNum2);

console.log(res) // Just 3
原文地址:https://www.cnblogs.com/Answer1215/p/9038130.html