Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用纯函数创建组合函数_Javascript_Functional Programming_Pure Function - Fatal编程技术网

Javascript 用纯函数创建组合函数

Javascript 用纯函数创建组合函数,javascript,functional-programming,pure-function,Javascript,Functional Programming,Pure Function,我正试图了解复合函数和纯函数 我有一个混合数据的对象。关于一些价值观,我需要: 删除值的单位 将字符串解析为整数 转换为十进制值 我写了三个函数,试图使它们变得纯粹,因为它们只做一件事,但严格来说,它们是变异状态。我不知道如何避免状态的变异,如果这在技术上使它不是一个纯函数 我的三个“纯”功能是: function parseValue(val) { return typeof val === 'number' ? val : parseInt(val) } function stri

我正试图了解复合函数和纯函数

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

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

    我的三个“纯”功能是:

    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
    }
    
    然后,在
    compose()

    当我尝试运行这个
    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}
    
    prepValue函数(){var n=arguments,e=n[0];if(o&&1==n.length&&of(e))返回o.plant(e).value();for(var u=0,n=r?t[u]。apply(this,n):e;++u在调用它之前需要“创建函数组合”

    函数parseValue(val){console.log(val)
    返回类型val=='number'?val:parseInt(val)
    }
    函数stripUnits(val){console.log(val)
    返回typeof val=='string'?val.match(/\d+/)[0]:val
    }
    函数convertToDecimal(val){console.log(val)
    返回值/100
    }
    函数值(val){
    返回组成(stripUnits、parseValue、convertToDecimal)(val);
    }
    console.log(“prepValue”,prepValue(“001232”);

    您犯的唯一错误是没有使用
    val
    作为参数调用生成的组合方法:

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

    [f1,f2,f3].reduce((f,g)=>value=>f(g(value))
    @destoryer这是用来替换组合函数的吗?
    prepValue
    返回组合函数。如果要立即调用它,请使用:
    返回组合(stripUnits,parseValue,convertToDecimal)(prepValue)
    。或者,即:
    const prepValue=compose(f1,f2,f3)
    但严格地说,它们是变异状态
    -是吗?我不认为它们是…@Stretch0是的,它返回类似于
    f(x)=>g(h(I(x)))
    为什么
    prepValueComp
    接受
    val
    而不使用它?谢谢,这解决了调用组合函数的问题,但我是@Jamiec,为什么
    prepValueComp
    接受
    val
    而不使用它?仍然不确定纯函数。我如何避免这些函数上的状态突变?@Jamiec It只编写函数(不需要处理任何参数)-但我更新了答案以匹配您的解决方案,因为这样更容易理解。@Stretch0 Pure函数总是返回相同的输出(给定相同的输入)而且不会产生副作用。在我看来,你的函数尊重这些条件,所以你会没事的;D.谢谢@Jamiec。你是说这三个函数是“纯”的吗?非常聪明而且很好的解决方案。干杯!@Jamic Compose似乎会反向组合函数。我发现
    const prepValue=Compose(convertToDecimal、parseValue、stripUnits)
    似乎产生了我所需要的结果
    function prepValue(val) {
        return compose(stripUnits, parseValue, convertToDecimal)(val);
    }