我无法理解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
的签名中?另外,→
是什么意思?
答案 0 :(得分:3)
我在这里给出一个简短的答案,但是更完整的答案会分散在a similar question的两个答案中,而这两个答案都来自Ramda wiki page。 (免责声明:我是该页面的作者,也是Ramda本身的一位负责人。)
这分为两部分:
Functor f => (a → b) → f a → f b
在胖箭(=>
)之前,我们对剩余部分有约束。此示例中的单个约束是变量f
必须是Functor
。 Functor是一种类型,其成员具有遵守某些法律的map
方法。并且声明是针对其他类型进行参数化的,因此我们不仅仅为f
,f String
,f 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
接受了从map
到Number
的函数,并返回一个带有Number
数组的函数并返回一个新函数Number
的数组。 (那是因为在这个系统中,Number
绑定到右边,所以->
相当于(a -> b -> c)
。在Ramda中,所有函数都以你可以使用的方式进行调整使用任何初始参数集调用它们,并且在提供所有条件之前,您将继续返回函数。因此,使用Ramda函数,(a -> (b -> c))
和R.map(double)([1, 2, 3])
之间没有真正的区别。