你怎么读ramda文档?

时间:2017-04-16 09:15:26

标签: javascript ramda.js

我无法理解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],那么如何将其置于f Functor f => (a → b) → f a → f b的签名中?另外,是什么意思?

1 个答案:

答案 0 :(得分:3)

我在这里给出一个简短的答案,但是更完整的答案会分散在a similar question的两个答案中,而这两个答案都来自Ramda wiki page。 (免责声明:我是该页面的作者,也是Ramda本身的一位负责人。)

这分为两部分:

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

在胖箭(=>)之前,我们对剩余部分有约束。此示例中的单个约束是变量f必须是Functor。 Functor是一种类型,其成员具有遵守某些法律的map方法。并且声明是针对其他类型进行参数化的,因此我们不仅仅为ff Stringf Number或更一般地写f a来表示某种未知类型{ {1}}。

瘦箭头(a)是Function类型的缩写。所以不要写

->

我们可以写

Function x y

或在需要时避免含糊不清。

x -> y

将这些放在一起,我们可以注意到,在(x -> y) 中,我们有R.map(double, [1, 2, 3])double的函数(Number),这意味着我们Number }和a都是b。我们的算子是Number。为了使用这些类型专门定义,我们Array接受了从mapNumber的函数,并返回一个带有Number数组的函数并返回一个新函数Number的数组。 (那是因为在这个系统中,Number绑定到右边,所以->相当于(a -> b -> c)。在Ramda中,所有函数都以你可以使用的方式进行调整使用任何初始参数集调用它们,并且在提供所有条件之前,您将继续返回函数。因此,使用Ramda函数,(a -> (b -> c))R.map(double)([1, 2, 3])之间没有真正的区别。