Ramda 文档中的类型签名使用的是Haskell 的语法, Haskell 作为一门纯函数式编程语言, 可以很简洁地表达柯里化的语义, 相较之下, TypeScript 的表达方式就显得比较臃肿....当然, 使用Haskell 的类型签名的意义不仅于此, 让我们再看看其他"奇怪"的函数类型:
ap:
[a → b] → [a] → [b]
Apply f => f (a → b) → f a → f...」, 这段类型签名可以先简单地理解为:
将一个包裹在上下文中的「函数」取出, 再将另一个包裹在上下文中的「值」取出, 调用函数后, 将函数的返回值重新包裹进上下文中并返回....函数也可以是一个 「上下文」?
答案是可以的, 我们可以将一个一元函数a -> b理解为"一个包裹在上下文中的b, 只不过为了获取这个b, 需要先传入一个a....先看看 Haskell 对ap 的定义:
instance Applicative ((->) r) where
() f g x = f x (g x)
替换为TypeScript 的实现