你如何阅读 ramda 文档?
how do you read the ramda docs?
我无法理解 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]
,那么它是如何放入Functor f => (a → b) → f a → f b
中f
的签名中的呢?另外,→
是什么意思?
我会在这里给出一个简短的答案,但更完整的答案分布在 , which in turn was taken from the Ramda wiki page 的两个答案中。 (免责声明:我是该页面的作者,也是 Ramda 本身的负责人之一。)
这分为两部分:
Functor f => (a → b) → f a → f b
在粗箭头 (=>
) 之前,我们对余数有限制。此示例中的单一约束是变量 f
必须是 Functor
。 Functor 是一种类型,其成员具有 map
方法,该方法遵守特定的法则。并且声明是在另一种类型上参数化的,所以我们不只写 f
,而是写 f String
、f Number
,或者更笼统地说,f a
对于某些未知类型 a
.
细箭头 (->
) 是函数类型的缩写。所以不要写
Function x y
我们可以改写
x -> y
或在需要时避免歧义。
(x -> y)
将这些放在一起,我们可以注意到在 R.map(double, [1, 2, 3])
中,我们有一个从 Number
到 Number
的函数 (double
),这意味着我们的 a
和 b
都是 Number
。而我们的函子是Array
。所以用这些类型专门化定义,我们有 map
接受一个从 Number
到 Number
的函数,并返回一个接受 Number
和 [=58] 数组的函数=] 一个新的 Number
数组。 (那是因为在这个系统中,->
绑定到右边,所以 (a -> b -> c)
等同于 (a -> (b -> c))
。在 Ramda 中,所有函数都以这样一种方式柯里化,你可以用任何方式调用它们初始参数集,直到所有项都被提供,你继续得到函数。因此对于 Ramda 函数,R.map(double)([1, 2, 3])
和 R.map(double, [1, 2, 3])
之间没有真正的区别。
我无法理解 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]
,那么它是如何放入Functor f => (a → b) → f a → f b
中f
的签名中的呢?另外,→
是什么意思?
我会在这里给出一个简短的答案,但更完整的答案分布在
这分为两部分:
Functor f => (a → b) → f a → f b
在粗箭头 (=>
) 之前,我们对余数有限制。此示例中的单一约束是变量 f
必须是 Functor
。 Functor 是一种类型,其成员具有 map
方法,该方法遵守特定的法则。并且声明是在另一种类型上参数化的,所以我们不只写 f
,而是写 f String
、f Number
,或者更笼统地说,f a
对于某些未知类型 a
.
细箭头 (->
) 是函数类型的缩写。所以不要写
Function x y
我们可以改写
x -> y
或在需要时避免歧义。
(x -> y)
将这些放在一起,我们可以注意到在 R.map(double, [1, 2, 3])
中,我们有一个从 Number
到 Number
的函数 (double
),这意味着我们的 a
和 b
都是 Number
。而我们的函子是Array
。所以用这些类型专门化定义,我们有 map
接受一个从 Number
到 Number
的函数,并返回一个接受 Number
和 [=58] 数组的函数=] 一个新的 Number
数组。 (那是因为在这个系统中,->
绑定到右边,所以 (a -> b -> c)
等同于 (a -> (b -> c))
。在 Ramda 中,所有函数都以这样一种方式柯里化,你可以用任何方式调用它们初始参数集,直到所有项都被提供,你继续得到函数。因此对于 Ramda 函数,R.map(double)([1, 2, 3])
和 R.map(double, [1, 2, 3])
之间没有真正的区别。