javascript偏函数应用与柯里化的区别

时间: 2017-12-01阅读: 307标签: js知识

很多刚刚了解函数式编程的人会对偏函数应用(partial application)和柯里化(currying)之间的区别感到困惑。实际上,直到现在也很少在 JavaScript 中看到柯里化的实际使用,许多叫curry()的工具函数并不是柯里化函数。它们其实是偏函数!

如果你也不清楚区别,本文会为你梳理清楚,不过让我们搞清楚一些词语:

定义

应用: 将函数应用于参数,以得到返回值的过程。

偏函数应用: 将函数应用于其部分参数的过程。返回的偏函数在之后被使用。也就是说,一个函数接收一个有多个参数的函数,返回一个需要较少参数的函数。偏函数将一到多个参数在内部固定,然后返回新函数,返回的函数接收剩余的参数完成函数的应用。

柯里化: 输入一个有多个参数的函数, 返回一个只接收单个参数的函数。

这有什么关系呢?

James Coglan 的演讲会帮助你理解:

James 讨论的特性依赖于函数类型一致性。函数有类型。举例来说,函数接收函数和数组,返回数组(例如,Function.prototype.map()):

(fn, array) -> array
  • 偏函数应用 会也可能不会有可预期的返回类型

  • 柯里化函数始终返回另一个具有单个参数而其他参数被指定的函数。

James 讨论的重要的东西都依赖于 函数类型一致性。例如他提到 promise 可以帮助程序逻辑抽象对时间的依赖。

Promise 可以做到是因为它提升了你调用的函数,使得其返回类型始终一致:所有返回 promise 的函数返回了相同的类型,这意味着你可以用标准化的方式来使用它们。James 提到了 promise 带来的各种好处。

这种情况下,promise 是 函子(functor) (一个巧妙的词,意思是“可以被映射的东西”,例如,数组。参考:可应用的函子(applicative functor))的容器,可以为处理数据提供标准化的方法,而无需考虑数据的类型。

警告: google 下函数式编程的术语会很吓人,不过相比其学术名称,它们其实很简单。

通过处理 容器 而非 容器中的值,你可以为任何使用 *容器接口 的东西创建很多一般的 到处可以使用的函数

和 promise 类似,*科里化函数返回容器,这提供了相同的接口。具体是指,作为容器的返回函数。你可以继续调用返回的函数,直到所有参数都传入后返回最终的值。

换句话说,柯里化函数时可以提升所有参数的函数,使得可以用标准化的方式处理这些参数。

最常见的使用提升的方式是 函数组合(function composition),例如c(x) = f(g(x))。函数组合将一个函数的返回值传给另一个函数作为参数。由于一个函数只能返回一个值,可以接收返回值的函数必定是一元的。

此外,柯里化函数有内置的迭代器机制:柯里化函数每次应用一个参数,不会做超出一个参数外的工作。调用返回的函数也就是告诉函数来进行下一步处理。

例如,柯里化函数 a(b)(c),不会立即调用 c,可以是这样的:

const next = a(b);
doSomeStuff().then(() => next(c));

你应该对偏函数应用和柯里化的区别,以及为什么要对函数执行柯里化有更清楚的理解了。

柯里化在函数式编程中的最常见的应用是让组合函数变得简单。关于这个话题,可以看 “Master the JavaScript Interview: What is Function Composition?”

来源:众成翻译


js中减少使用不必要的if-else或switch_利用数组/对象代替if-else,switch

无论使用if-else,还是switch。当条件多的时候代码显得非常冗长,而且每次添加条件时需要修改主流程的代码,这样就破坏了类的开闭原则。为解决日后的维护可能存在问题,我们可以采用另一种比较优雅的实现方式来替换if-else,switch吗?

JavaScript深入之参数按值传递

ECMAscript中所有函数的参数都是按值传递,也就是,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。js始终是按值传递,在这里称他为共享传递。

为什么尽量别用setInterval

在开发一个在线聊天工具时,经常会有过多少毫秒就重复执行一次某操作的需求。“没问题”,大家都说,“用setInterval好了。”我觉得这个点子很糟糕。

avaScript与WebAssembly进行比较+在哪些情况下会优于JavaScript

这是专门探索JavaScript及其构建组件的系列,在识别和描述核心元素的过程中,我们还分享了构建SessionStack时使用的一些经验法则,这是一个轻量级但健壮且高性能的JavaScript应用程序,以帮助用户实时查看和重现其Web应用程序的缺陷。

js判断是否为IE浏览器的多种方法总汇

这篇文章主要整理通过js来判断浏览器是否为IE的多种方法。使用js脚本判断浏览器是否为ie,这里分享六种判断是否为ie的方法,有需要的朋友参考学习下。

js中return关键词的作用_return的用法详解

return从字面意思来看就是返回,官方定义return语句将终止当前函数并可以返回当前函数的值; 也就是说return后面可以跟一个value,也就是说可以跟javascript中的任何数据类型

js记录用户行为浏览记录和停留时间

原来是想使用 cookie 来记录,但是考虑到 cookie 所能记录的数据最大为 4k ,可能不够用。于是使用了 HTML5 的 localStorage (最大数据 5M )来存储( IE8 以上浏览器支持)。这里使用到了 jquery.cookie 的插件,所以页面要引入 jquery 和 jquery.cookie 。

Web Worker 详细介绍_Web Workers的使用

web worker 是运行在后台的 JavaScript,独立于其他脚本,也就是说在Javascript单线程执行的基础上,开启一个子线程,进行程序处理,而不影响主线程的执行。Service Worker 是一个由事件驱动的 worker,它由源和路径组成,以加载 .js 文件的方式实现的。

数字在JavaScript中是如何编译的

JavaScript中的所有数字都是浮点数。这篇博客文章解释了这些浮点数如何在64位二进制内部表示。浮点数并不一定等于小数,定点数也并不一定就是整数。所谓浮点数就是小数点在逻辑上是不固定的,而定点数只能表示小数点固定的数值

window.location.href的用法(动态输出跳转)

javascript中的location.href有很多种用法,window.location.href 语句可以实现一个框架的页面在执行服务器端代码后刷新另一个框架的页面