zoukankan      html  css  js  c++  java
  • [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
  • 相关阅读:
    装箱拆箱操作
    《设计原本》试读:什么是设计
    代码大全中英文要点
    JSON对象和字符串之间的相互转换
    《设计原本》试读:何为真实?设计的概念
    Facebook后台技术探秘 世界最大的PHP网站
    重构模式:用异步计算替代长计算
    生命不息编程不止 Facebook CEO还在写代码
    万能的js复制按钮
    《网站设计解构》试读:1.1 可重用策略
  • 原文地址:https://www.cnblogs.com/Answer1215/p/9038130.html
Copyright © 2011-2022 走看看