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)
接受两个函数并返回第三个函数。