首页 > js 函数式编程问题

js 函数式编程问题

在 codewars 上看到的一道函数式编程题
要求写出0~9十个函数和加减乘除四个函数,最终实现以下功能

seven(times(five())); // must return 35
four(plus(nine())); // must return 13
eight(minus(three())); // must return 5
six(dividedBy(two())); // must return 3

有点绕晕了,麻烦大能解惑下,不胜感激。


没有使用价值,不必纠结


感觉 @Theo 做的还不是特别彻底.

var createValue = function( v ) {
    return function( f ) {
        if ( typeof f === 'function' ) {
            return f( v );
        }
        else return v;
    };
};

var createAction = function( action ) {
    return function(m) {
        return function(n) {
            return action( n, m );
        };
    };
};

var one = createValue( 1 )
var two = createValue( 2 );
var plus = createAction(function( m, n ) {
    return m + n;
});
var minu = createAction(function( m, n ) {
    return m - n;
});

十个数字函数,四个操作函数,思路最简单的话这样就行。。

function one(x){
    if(x == null){
        return 1;
    }else{
        return eval('1'+x);
    }
}
function two(x){
    if(x == null){
        return 2;
    }else{
        return eval('2'+x);
    }
}
function three(x){
    if(x == null){
        return 3;
    }else{
        return eval('3'+x);
    }
}
function four(x){
    if(x == null){
        return 4;
    }else{
        return eval('4'+x);
    }
}
function five(x){
    if(x == null){
        return 5;
    }else{
        return eval('5'+x);
    }
}
function six(x){
    if(x == null){
        return 6;
    }else{
        return eval('6'+x);
    }
}
function seven(x){
    if(x == null){
        return 7;
    }else{
        return eval('7'+x);
    }
}
function eight(x){
    if(x == null){
        return 8;
    }else{
        return eval('8'+x);
    }
}
function nine(x){
    if(x == null){
        return 9;
    }else{
        return eval('9'+x);
    }
}
function zero(x){
    if(x == null){
        return 0;
    }else{
        return eval('0'+x);
    }
}
function minus(x){
    return '-'+x;
}
function times(x){
    return '*'+x;
}
function plus(x){
    return '+'+x;
}
function dividedBy(x){
    return '/'+x;
}

对js不熟,应该是这样:

function partial_op_with_oper2(op, oper2) {
    return function(oper1) {
        return op(oper1, oper2);
    };
}

function make_operand(value) {
    return function(oper2) {
        if (oper2) {
            return oper2(value);
        } else {
            return value;
        }
    };
}

// "Operators"
var times = function(b) {
    var op = function(a, b) { return a * b; };
    return partial_op_with_oper2(op, b);
};

var plus = function(b) {
    var op = function(a, b) { return a + b; };
    return partial_op_with_oper2(op, b);
};

// "Operands"
var zero = make_operand(0);
var one = make_operand(1);
var two = make_operand(2);
var three = make_operand(3);
var four = make_operand(4);
var five = make_operand(5);
var six = make_operand(6);
var seven = make_operand(7);
var eight = make_operand(8);
var nine = make_operand(9);

跟 @brayden 的一个意思


正确答案

var names = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'];

names.forEach(function (name, i) {
  window[name] = function (fn) {
    if (!fn) return i + 1;
    return fn(i + 1);
  }
})

function times(i) {
  return function (j) {
    return i*j;
  }
}

function plus(i) {
  return function (j) {
    return i+j;
  }
}

function minus(i) {
  return function (j) {
    return j-i;
  }
}

function dividedBy(i) {
  return function (j) {
    return j/i;
  }
}

大概这个意思吧.

function one(fun)
{
    if(fun) return fun(1); 
    return 1;
}

function two(fun)
{
    if(fun) return fun(2); 
    return 2;
}

function plus(num)
{
    return function(a){return a + num;}
}

one(plus(two()));

function _num(num,fn){
  if(typeof fn === 'function')return fn(num);
  return num;
}
function zero(fn) {return _num(0,fn);}
function one(fn) {return _num(1,fn);}
function two(fn) {return _num(2,fn);}
function three(fn) {return _num(3,fn);}
function four(fn) {return _num(4,fn); }
function five(fn) {return _num(5,fn);}
function six(fn) {return _num(6,fn);}
function seven(fn) {return _num(7,fn);}
function eight(fn) {return _num(8,fn);}
function nine(fn) {return _num(9,fn);}

function plus(num) {
  return function(a){
    return a + num;
  };
}
function minus(num) {
  return function(a){
    return a - num;
  };
}
function times(num) {
  return function(a){
    return a * num;
  };
}
function dividedBy(num) {
  return function(a){
      return a / num;
   };
【热门文章】
【热门文章】