柯里化

简介: 柯里化

本文旨在介绍函数式编程中柯里化的概念,以及在JavaScript中应该何时使用它。

本文将首先解释什么是柯里化,然后展示它在函数式编程背景下的用处。


什么是柯里化


柯里化是指函数永远只接受一个参数,如果需要处理多个参数,则返回另一个函数来接收单一的参数。相比之下,常规非柯里化函数可以接受多个参数。

以下是一个常规、非柯里化函数的例子:


const add = (x, y) => x + y
console.log(
  add(2, 3) // 2 + 3
) // prints 5


这是一个简单的函数,它接受两个参数并返回它们的和。

相同函数的柯里化版本如下所示:


const addCurried = x => y => x + y
console.log(
  addCurried(2)(3) // 2 + 3
) // prints 5


该函数不是接收两个参数,而是接收一个参数,然后返回另一个接收一个参数并返回两参数之和的函数。

通过这种方式,我们可以传递任意数量的参数:


const addMore = a => b => c => d => e => a + b + c + d + e
console.log(
  addMore(1)(2)(3)(4)(5) // 1 + 2 + 3 + 4 + 5
) // prints 15


由于柯里化函数的工作方式,我们可以进行称为部分应用的操作。部分应用是指我们向函数提供少于其可以接受的参数数量的参数:


const addCurried = x => y => x + y
console.log(
  addCurried(2) // y => 2 + y
) // [Function (anonymous)]


如果我们仅向 addCurried 函数传递一个参数,则结果是一个,接收一个参数的函数。换句话说,数字 2 传递给了 x 参数,因此我们得到的值是 y => 2 + y。如果需要的话,我们可以将这个部分应用的函数存储到一个变量中,以便在以后复用


const addCurried = x => y => x + y
const add2 = addCurried(2)
// This is the same as:
// const add2 = y => 2 + y
console.log(
  add2(3) // 2 + 3
) // prints 5
console.log(
  add2(10) // 2 + 10
) // prints 12


现在我们有了一个名为 add2 的函数,它可以接收一个参数。不管我们给它传入什么参数,它都会+2 。


什么时候使用柯里化函数呢?


函数柯里化在我们的普通的函数时是没有什么优势的,他的真正优势在于组合使用,只有在组合使用时才它能真正发挥了作用。

在 JavaScript 中,组合两个函数的方式如下所示:


const compose = (f, g) => x => f(g(x))
const addCurried = x => y => x + y
console.log(
  compose(addCurried(2), addCurried(3))(10) // 10 + 3 + 2 = 15
) // prints 15


让我们来理解上面的操作,

  • addCurried(2)=2+y,addCurried(3)=3+y
  • compose(addCurried(2), addCurried(3))=2+(3+y)
  • 又因为(f, g) => x => f(g(x))返回的是一个函数,这个函数接收一个参数值x
  • 所以compose(addCurried(2), addCurried(3))=2+(3+y) =x =>2+(3+x)
  • 又因为我又传入了一个值10
  • 所以最终结果就是2+(3+10)=15
目录
相关文章
|
4月前
|
存储 算法
什么是高阶函数
什么是高阶函数
85 1
|
4月前
|
JavaScript 索引 Windows
函数柯里化
函数柯里化
35 0
|
11月前
2 # 函数柯里化
2 # 函数柯里化
30 0
|
11月前
|
JavaScript 前端开发 Java
函数式编程入门:理解纯函数、高阶函数与柯里化
函数式编程入门:理解纯函数、高阶函数与柯里化
118 0
|
11月前
1 # 高阶函数
1 # 高阶函数
51 0
|
JavaScript 前端开发 网络架构
朋友,柯里化(Currying)了解一哈
greet获取了它应获取的参数,curry也停止了递归处理。并且,我们也获得了想要的结果Hello,范北宸。 其实利用curry对greet经过如上处理之后,现在处理之后的函数能够同时接收任意(n≥0)的参数。
110 0
|
C#
C#匿名函数
C#匿名函数
86 0
|
存储
函数柯里化详解
函数柯里化详解
124 0
|
编译器 Scala 开发者
函数柯里化 | 学习笔记
快速学习函数柯里化