类型签名与 Lambda 演算
Lambda 演算是什么?
- Lambda 演算: 用函数建立通用计算模型的一支数学理论;
- 在函数式编程中,Lambda 表达式、函数应用和抽象都源于这一模型;
JavaScript 注释如何表达函数类型签名?
- 约定:
函数名 :: 参数类型 -> 返回类型; - 多个箭头: 表示柯里化后逐个接收参数;
// add :: Number -> Number -> Number
const add = (x) => (y) => x + y;
// increment :: Number -> Number
const increment = (x) => x + 1;
高阶函数的参数签名为什么要加括号?
- 括号表示一个完整的函数类型,避免与外层参数链混淆;
// call :: (a -> b) -> a -> b
const call = (fn) => (x) => fn(x);
小写类型变量代表什么?
a、b、c: 可替换为任意具体类型的类型变量;- 相同字母: 多个位置必须使用同一个类型;
- 不同字母: 允许输入和输出类型不同;
// map :: (a -> b) -> [a] -> [b]
const map = (fn) => (list) => list.map(fn);
类型签名能提前回答哪些问题?
- 参数顺序: 哪个数据先传入;
- 组合可能性: 前一函数输出能否接入后一函数输入;
- 多态性: 函数依赖具体类型,还是只依赖结构;
- 局限: 注释只描述约定,JavaScript 本身不会自动验证;