注意:这是关于“ 学习 JavaScript ES6 +中的函数编程技术”的“ JavaScript和函数编程”系列的一部分。 要从头开始,请查看<第1部分>
咖喱化是指当我们调用一个函数的参数少于预期的函数时。 反过来,调用的函数返回一个带有其余参数的函数。
const magicPhrase =
(magicWord) =>
(muggleWord) =>
magicWord + muggleWord
然后,我们可以使用以下模式调用此函数
编写返回函数,然后返回一些输出(可能是另一个函数!)的函数可能会很麻烦。 幸运的是,我们有功能性的JS帮助程序库,例如Ramda和lodash,它们为我们提供了实用的方法,例如curry。 curry实用程序包装通常声明的函数,并将它们转换为一系列单参数函数。 因此我们可以将之前的代码转换为:
import _ from "lodash"
const magicPhrase = _.curry((magicWord, muggleWord) => magicWord + muggleWord)
const muggleWordAccepter = magicPhrase("Abra kedabra ")
muggleWordAccepter("dishwasher")
另一个例子是我们最喜欢的add函数的改进实现
import _ from "lodash"
const addFunction = _.curry((a, b) => a + b)
const addOne = add(1)
addTen(1)
因此,我们实质上是用第一个变量“预加载” add函数。 我们的函数能够记住由于JS闭包而传递的第一个值。
为什么要关心咖喱
- Currying使我们能够编写简洁,简洁和可重用的功能。
2.我们将这些功能用作干净,可测试的逻辑单元,以构成程序中逻辑上更复杂的部分。
3.通过使用curring,只需将其包装为map ,就可以将对单个元素起作用的任何函数转换为对数组(列表)起作用的函数。
const getObjectId = (obj) => obj.id // works on single object
const arrayOfObjects = [{id: 1}, {id: 2}, {id: 3}, {id: 4}]
const arrayOfIDs = arrayOfObjects.map(getObjectId)
例子
熟悉这些概念的唯一真正方法是练习:)让我们开始吧。 我们将从一个将在单个元素上运行的函数转换为在数组上运行的函数的另一个示例开始。
const getFirstTwoLettersOfWord = (word) => word.substring(0,2)
// We can convert it, by wrapping it in the map method
["aabb", "bbcc", "ccdd", "ddee"].map(getFirstTwoLettersOfWord)
下一个示例来自令人惊叹的“几乎足够”指南,其中包含少量的ES6重构:)
让我们重构max函数,使其不引用任何参数。
arr = [2,4,6,8,9]
// LEAVE BE:
const getMax = (x, y) => {
return x >= y ? x : y;
};
// REFACTOR THIS ONE:
const max = (arr) => {
return arr.reduce((acc, x) => {
return getMax(acc, x);
}, -Infinity);
};
const max = arr.reduce(getMax, -Infinity)
让我们包装本机JS slice方法,以便它可以正常工作。
import _ from "lodash"
const arr = ["barney", "fred", "dave"]
arr.slice(0, 2) // ["barney", "fred"]
["barney", "fred"]
摘要
我们已经看到了几个咖喱JS函数的示例。 咖喱化是指将具有多个Arity(接受参数)的功能转换为具有较少Arity的相同功能的过程。 它利用JS闭包来记住先前调用中使用的参数。 Currying扭曲功能可以使它们更自然地协同工作。 它的最大优点是可以轻松实现功能组合,我们将在下一篇文章中深入探讨!
如果此帖子有帮助,请单击下面的拍手ap按钮以表示支持! ⬇⬇
您可以在Instagram , Linkedin和Medium上关注我。
From: https://hackernoon.com/javascript-and-functional-programming-currying-pt-4-96e3230782ab