跳到主要内容

函数构件

函数式编程中的函数是什么?​

  • 函数: 从一个不可变参数 A 到一个返回值 B 的映射,可写成 f :: A -> B;
  • 纯函数口径: 返回值只由参数决定,不读取隐藏状态,也不产生隐藏副作用;
  • 一等值: 函数可赋给变量、传入其他函数或作为返回值;
const times2 = (n) => n * 2;
[1, 2, 3].map(times2); // [2, 4, 6]

元数怎样描述函数的参数数量?​

名称元数示例
nullary0() => 0
unary1(a) => a + 1
binary2(a, b) => a + b
ternary3(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]