函数构件
函数式编程中的函数是什么?
- 函数: 从一个不可变参数
A到一个返回值B的映射,可写成f :: A -> B; - 纯函数口径: 返回值只由参数决定,不读取隐藏状态,也不产生隐藏副作用;
- 一等值: 函数可赋给变量、传入其他函数或作为返回值;
const times2 = (n) => n * 2;
[1, 2, 3].map(times2); // [2, 4, 6]
元数怎样描述函数的参数数量?
| 名称 | 元数 | 示例 |
|---|---|---|
| nullary | 0 | () => 0 |
| unary | 1 | (a) => a + 1 |
| binary | 2 | (a, b) => a + b |
| ternary | 3 | (a, b, c) => a+b+c |
- 元数(arity): 函数接收的参数个数;
- 用途: 柯里化、偏应用和组合都依赖明确的参数形状;
高阶函数怎样把行为当作数据?
- 高阶函数: 接收函数、返回函数,或同时满足两者;
filter: 接收谓词作为参数;is: 返回一个新的类型判断函数;
const filter = (predicate, xs) => xs.filter(predicate);
const is = (type) => (x) => Object(x) instanceof type;
filter(is(Number), [0, "1", 2, null]); // [0, 2]
闭包为什么能记住外层变量?
- 闭包: 函数离开定义块后,仍保留对词法作用域变量的访问;
- 捕获:
addTo(5)返回的函数持续保存x = 5;
const addTo = (x) => (y) => x + y;
const addToFive = addTo(5);
addToFive(3); // 8
Lambda 与谓词分别表达什么?
- Lambda: 可作为值使用的匿名函数,例如
(a) => a + 1; - 常见位置: 直接传给
map、filter等高阶函数; - 谓词: 对给定值返回布尔值的函数,常用于筛选与验证;
const predicate = (a) => a > 2;
[1, 2, 3, 4].filter(predicate); // [3, 4]