你如何阅读 ramda 文档?

how do you read the ramda docs?

我无法理解 Ramda 的签名 docs。例如,如果你看 map 你会看到这个

Functor f => (a → b) → f a → f b

我不明白这个模式如何适合这个例子:

var double = x => x * 2;

R.map(double, [1, 2, 3]); //=> [2, 4, 6]

这个例子中的仿函数是[1,2,3],那么它是如何放入Functor f => (a → b) → f a → f bf的签名中的呢?另外, 是什么意思?

我会在这里给出一个简短的答案,但更完整的答案分布在 , which in turn was taken from the Ramda wiki page 的两个答案中。 (免责声明:我是该页面的作者,也是 Ramda 本身的负责人之一。)

这分为两部分:

Functor f => (a → b) → f a → f b

在粗箭头 (=>) 之前,我们对余数有限制。此示例中的单一约束是变量 f 必须是 Functor。 Functor 是一种类型,其成员具有 map 方法,该方法遵守特定的法则。并且声明是在另一种类型上参数化的,所以我们不只写 f,而是写 f Stringf Number,或者更笼统地说,f a 对于某些未知类型 a.

细箭头 (->) 是函数类型的缩写。所以不要写

Function x y

我们可以改写

x -> y

或在需要时避免歧义。

(x -> y)

将这些放在一起,我们可以注意到在 R.map(double, [1, 2, 3]) 中,我们有一个从 NumberNumber 的函数 (double),这意味着我们的 ab 都是 Number。而我们的函子是Array。所以用这些类型专门化定义,我们有 map 接受一个从 NumberNumber 的函数,并返回一个接受 Number 和 [=58] 数组的函数=] 一个新的 Number 数组。 (那是因为在这个系统中,-> 绑定到右边,所以 (a -> b -> c) 等同于 (a -> (b -> c))。在 Ramda 中,所有函数都以这样一种方式柯里化,你可以用任何方式调用它们初始参数集,直到所有项都被提供,你继续得到函数。因此对于 Ramda 函数,R.map(double)([1, 2, 3])R.map(double, [1, 2, 3]) 之间没有真正的区别。