创建具有纯函数的组合函数

时间:2018-03-14 10:32:43

标签: javascript functional-programming pure-function

我试图了解组合函数和纯函数。

我有一个混合数据的对象。在某些价值观上,我需要:

  1. 删除值单位
  2. 将字符串解析为整数
  3. 转换为十进制值
  4. 我写过三个函数试图让它们变得纯粹,因为它们只做一件事,但严格来说,它们是变异状态。我不确定如何避免变异状态,如果这在技术上使它不是一个纯函数?

    我的三个"纯粹"功能是:

    function parseValue(val) {
        return typeof val === 'number' ? val : parseInt(val)
    }
    
    function stripUnits(val) {
        return typeof val === 'string' ? val.match(/\d+/)[0] : val
    }
    
    function convertToDecimal(val) {
        return val / 100
    }
    

    然后我试图在lodash compose()

    的帮助下将这些函数组合成一个函数
    function prepValue(val) {
        return compose(stripUnits, parseValue, convertToDecimal)
    }
    

    当我尝试运行此console.log("prepValue", prepValue(weather.current.temperature))时,我在终端中获得以下内容:

    prepValue function (){var n=arguments,e=n[0];if(o&&1==n.length&&of(e))return o.plant(e).value();for(var u=0,n=r?t[u].apply(this,n):e;++u<r;)n=t[u].call(this,n);return n}
    

    所以主要的是,

    1. 我怎样才能完成我的三个功能&#34; pure&#34;
    2. 如何将这些功能组合成1

2 个答案:

答案 0 :(得分:2)

你犯的唯一错误就是不用val作为参数调用结果组合方法:

function prepValue(val) {
    return compose(stripUnits, parseValue, convertToDecimal)(val);
}

答案 1 :(得分:1)

在调用之前,您需要“创建函数组合”。

function parseValue(val) { console.log(val)
    return typeof val === 'number' ? val : parseInt(val)
}

function stripUnits(val) { console.log(val)
    return typeof val === 'string' ? val.match(/\d+/)[0] : val
}

function convertToDecimal(val) {console.log(val)
    return val / 100
}

function prepValue(val) {
    return _.compose(stripUnits, parseValue, convertToDecimal)(val);
}

console.log("prepValue", prepValue('001232'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.fp.js"></script>