2017-04-16 92 views
2

我无法理解Ramda docs的签名。例如,如果你看一下map你看这你如何阅读ramda文档?

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

最好去问这里:。https://gitter.im/ramda/ramda – dfsq

回答

3

我在这里给出一个简短的答案,但更完整的一个分布在a similar question的两个答案中,而这个答案又取自Ramda wiki page。 (免责声明:我该网页的作者和Ramda本身的负责人之一。)

这分为两个部分:

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

脂肪箭头前(=>)我们有约束其余的。本例中的单个约束是变量f必须是Functor。 Functor是其成员具有遵守特定法律的map方法的类型。并且声明是通过另一种类型参数化的,所以我们不写f,但是f Stringf Number或更一般地,f a对于某些未知类型a

紧身箭头(->)是Function类型的缩写。因此,而不是写

Function x y 

,我们可以代替写

x -> y 

或在需要时以避免歧义。

(x -> y) 

把这些在一起,我们可以注意到,在R.map(double, [1, 2, 3]),我们从Number功能(double)到Number,这意味着我们的ab都是Number。而我们的函子是Array。因此,我们使map接受从NumberNumber的函数,并返回一个函数,该函数接收一个数组Number s并返回一个新的数组Number s。 (这是因为在这个系统中,->绑定到右边,所以(a -> b -> c)相当于(a -> (b -> c))。在Ramda中,所有函数都以这样的方式进行curried,以便您可以用任何初始参数调用它们,直到所有项已经提供的,你继续找回功能,因此与Ramda功能有R.map(double)([1, 2, 3])R.map(double, [1, 2, 3])之间没有真正的区别

+0

是'功能xy'一样的作为'function x(){y}'? – stackjlei

+1

不,函数xy和它的简写形式'x - > y'表示一个函数,它接受一个'x'类型的参数并返回一个'y'类型。 'function(str){return str.length;}'具有'Function String Int'类型或更简洁的'String - > Int'。 –

+1

当它接受2个字符串作为参数并返回一个布尔值时,为什么propEq具有'String→a→Object→Boolean'的签名?不应该是'string,string' - > boolean'吗? – stackjlei