javascript 中的柯里化日期时间

Currying date time in javascript

我是柯里化的新手,但我有一个我无法解决的问题。

function curry(func) {
    return date1=>{
        return date2=>{
            return date3=>{
                return func(date1,date2,date3);
            };
        };
    };
}



function format_date(a,b,c){
    return a+ "." + b +"."+c;
}

var date= curry(format_date);

console.log(date(1)(12)(2020));
console.log(date(1,12)(2020));
console.log(date(1)(12, 2020));
console.log(date(1,12, 2020));

所有日志的输出应该是 1.12.2020 但我只得到第一个正确的其他 return [Function(anonymous)]

你可以采用双柯里化函数来传递收集到的参数和参数。

这种方法允许使用带有独立参数的date

function curry(func) {
    const
        fn = p => (...args) => {
            const parameters = [...p, ...args];
            if (parameters.length >= func.length) return func(...parameters);
            return fn(parameters);
        };

    return fn([]);
}

function format_date(a, b, c) {
    return a + "." + b + "." + c;
}

var date = curry(format_date);

console.log(date(1)(12)(2020));
console.log(date(2, 12)(2020));
console.log(date(3)(12, 2020));
console.log(date(4, 12, 2020));

柯里化是函数式编程的一个非常重要的方面。曾几何时,JS 被设置为在功能方向上取得进展,但随后头部发生了变化。连同它的所有功能,它将再次在命令式路径上发展。人们几乎忘记了在 JS 中获取函数。现在你看到每个人都拥抱 async await 而不是一元承诺。伤心。

随便;回到你的问题,当然在 JS 中你可以柯里化一个函数,即使它有无限数量的参数。

var curry = f => f.length ? (...a) => curry(f.bind(f,...a)) : f(),

就是这样..!

如果你要柯里化的函数是;

function format_date(a,b,c){
    return a+ "." + b +"."+c;
}

那就让我们看看他们的行动吧;

function format_date(a, b, c) {
        return a + "." + b + "." + c;
    }

var curry = f => f.length ? (...a) => curry(f.bind(f,...a)) : f(),
    fDate = curry(format_date);
    
console.log(fDate(2021)(11)(30));