Javascript 你怎么看拉姆达的文件?

Javascript 你怎么看拉姆达的文件?,javascript,ramda.js,Javascript,Ramda.js,我很难理解拉姆达的签名。例如,如果您查看map,您会看到 函子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=>(a)中f的签名中呢→ (b)→ f a→ f b?另外,→意思?我将在这里给出一个简短的答案,但更完整的答案将分布在两个答案中,这两个答案依次取自。(免责声明

我很难理解拉姆达的签名。例如,如果您查看
map
,您会看到

函子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=>(a)中
f
的签名中呢→ (b)→ f a→ f b
?另外,
意思?

我将在这里给出一个简短的答案,但更完整的答案将分布在两个答案中,这两个答案依次取自。(免责声明:我是该页面的作者,也是Ramda本身的负责人之一。)

这分为两部分:

Functor f => (a → b) → f a → f b
在胖箭头(
=>
)之前,我们对其余部分有约束。本例中的一个约束条件是变量
f
必须是a。函子是一种类型,其成员有一个
map
方法,该方法遵循某些规律。声明是在另一个类型上参数化的,所以我们不只是写
f
,而是写
f String
f Number
,或者更一般地说,写一些未知类型
a

窄箭头(
->
)是type函数的缩写。因此,与其写作

Function x y
我们可以改为写作

x -> y
或者在需要避免歧义的时候

(x -> y)

把这些放在一起,我们可以注意到在
R.map(double,[1,2,3])
中,我们有一个从
Number
Number
的函数(
double
),这意味着我们的
a
b
都是
Number
。我们的函子是
数组
。因此,将这些类型的定义专门化,我们将
map
接受一个从
Number
Number
的函数,并返回一个接受
Number
s数组并返回一个新的
Number
s数组的函数。(这是因为在这个系统中,
->
绑定到右边,所以
(a->b->c)
相当于
(a->(b->c))
。在Ramda中,所有函数都可以用任何初始参数集调用,在提供所有术语之前,您可以继续返回函数。因此,对于Ramda函数,
R.map(double)([1,2,3])和
R.map(double[1,2,3])之间没有真正的区别

最好在这里问一下:不,
函数xy
,及其缩写
x->y
,表示一个函数,它接受
x
类型的参数,并返回
y
类型的函数(str){return str.length;}
的类型为
函数字符串Int
或者更简洁地说是
字符串->Int
。为什么propEq有
字符串的签名→ A.→ 对象→ 布尔值
当它接受2个字符串作为参数并返回布尔值时?它不应该是
string,string
->Boolean`?
propEq('foo',42,{foo:42,bar:52})/=>true
propEq('foo',42,{foo:52,bar:42})/=>false
。第一个参数必须是字符串第二个参数是任意类型的(这里是一个数字,但任何东西都是允许的)第三个必须是对象。它返回一个布尔值。该签名看起来是正确的。我如何知道最终返回的是什么?在前面提到的示例中,
->
绑定正确,因此
(a->b->c)
相当于
(a->(b->c))
,但对于propEq,它看起来像
字符串→ A.→ 对象→ 布尔值
相当于
(字符串→ A.→ (对象)→ 布尔的
Ramda的curry版本意味着它们都是等价的:
propEq('x')(42)(obj)
propEq('x')(42,obj)
propEq('x',42)(obj)
。所有中间形式都是(curry)函数。如果最终输出也是一个函数,它将被包装在括号中:
comp::(b->c)->(a->b)->(a->c)
接受两个函数并返回第三个函数。