85 lines
1.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
id: 587d7dab367417b2b2512b70
title: 函数柯里化
challengeType: 1
forumTopicId: 301232
---
# --description--
`arity`是函数所需的形参的数量。函数`柯里化`意思是把接受多个`arity`的函数变换成接受单一`arity`的函数。
换句话说,就是重构函数让它接收一个参数,然后返回接收下一个参数的函数,依此类推。
举个例子:
```js
//Un-curried function
function unCurried(x, y) {
return x + y;
}
//柯里化函数
function curried(x) {
return function(y) {
return x + y;
}
}
//Alternative using ES6
const curried = x => y => x + y
curried(1)(2) // 返回 3
```
柯里化在不能一次为函数提供所有参数情况下很有用。因为它可以将每个函数的调用保存到一个变量中,该变量将保存返回的函数引用,该引用在下一个参数可用时接受该参数。下面是使用`柯里化`函数的例子:
```js
// Call a curried function in parts:
var funcForY = curried(1);
console.log(funcForY(2)); // Prints 3
```
类似地,`局部应用`的意思是一次对一个函数应用几个参数,然后返回另一个应用更多参数的函数。 举个例子:
```js
//Impartial function
function impartial(x, y, z) {
return x + y + z;
}
var partialFn = impartial.bind(this, 1, 2);
partialFn(10); // Returns 13
```
# --instructions--
填写`add`函数主体部分,用柯里化添加参数`x``y``z`.
# --hints--
`add(10)(20)(30)`应返回`60`
```js
assert(add(10)(20)(30) === 60);
```
`add(1)(2)(3)`应返回`6`
```js
assert(add(1)(2)(3) === 6);
```
`add(11)(22)(33)`应返回`66`
```js
assert(add(11)(22)(33) === 66);
```
应返回`x + y + z`的最终结果。
```js
assert(code.match(/[xyz]\s*?\+\s*?[xyz]\s*?\+\s*?[xyz]/g));
```
# --solutions--