【es6】函数柯里化(Currying)

柯里化(Currying):把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数。
柯里化由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的,它是 Moses Schnfinkel 和 Gottlob Frege 发明的。
在这里插入图片描述

柯里化的应用最为切底是纯函数编程语言Haskell ,Haskell 中还有很多思想对其他语言有着深刻影响,比如模式匹配、柯里化、函数式编程等。

Haskell 的代码:

multThree :: (Num a) => a -> a -> a -> a 
multThree x y z = x * y * z

若执行mulThree 3 5 9((mulThree 3) 5) 9, 首先,按照空格分隔,把3交给mulThree。 这返回一个返回函数的函数。 然后把5交给它,返回一个取一个参数并使之乘以15的函数。 最后把9交给这一函数,返回135。 这个函数的类型也可以写作multThree :: (Num a) => a -> (a -> (a -> a)),->前面的东西就是函数取的参数,后面的东西就是其返回值。 所以说,我们的函数取一个a,并返回一个类型为(Num a) => a -> (a -> a)的函数,类似,这一函数返回一个取一个a,返回一个类型为(Num a) => a -> a的函数。 而最后的这个函数就只取一个a并返回一个a。
即:((mulThree 3) 5) 9

mulThree 3 =>multThree 3 y z = 3 * y * z  
mulThree 5 =>multThree 3 5 z = 3 * 5 * z
mulThree 9 =>multThree 3 5 9 = 3 * 5 * 9

下面来看看js中的柯里化:
代码:

function currying(fn, n) {
  return function (m) {
    return fn.call(this, m, n);
  };
}

function tailFactorial(n, total) {
  if (n === 1) return total;
  return tailFactorial(n - 1, n * total);
}

const factorial = currying(tailFactorial, 1);

factorial(5) // 

执行currying(tailFactorial, 1) 返回的函数是:

function tailFactorial(n, 1) {
  if (n === 1) return total;
  return tailFactorial(n - 1, n * 1);
}

本来需要传两个参数n、m,经过柯里化之后只需传一个参数,便可以求出n的阶乘。
这样做的好处是可以复用代码,通过设置 currying(fn, n)中的n值来得到不同的其实参数的函数。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

科学熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值