【问题标题】:how do you read the ramda docs?你如何阅读 ramda 文档?
【发布时间】:2017-09-12 03:17:33
【问题描述】:

我无法理解 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 bf 的签名中的呢?另外, 是什么意思?

【问题讨论】:

标签: javascript ramda.js


【解决方案1】:

我将在这里给出一个简短的答案,但更完整的答案分布在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 x y

我们可以改写

x -> y

或在需要避免歧义时。

(x -> y)

把这些放在一起,我们可以注意到在R.map(double, [1, 2, 3])中,我们有一个从NumberNumber的函数(double),这意味着我们的ab都是Number .我们的函子是Array。所以用这些类型专门定义,我们让map 接受从NumberNumber 的函数,并返回一个函数,该函数接受Numbers 的数组并返回Numbers 的新数组。 (这是因为在这个系统中,-> 绑定到右边,所以(a -> b -> c) 等价于(a -> (b -> c))。在 Ramda 中,所有函数都以这样一种方式进行柯里化,您可以使用任何初始参数集调用它们,并且在提供所有条款之前,您将继续获取函数。因此,对于 Ramda 函数,R.map(double)([1, 2, 3])R.map(double, [1, 2, 3]) 之间没有真正的区别。

【讨论】:

  • 不,Function x y 及其简写x -> y 表示一个函数,它接受x 类型的参数并返回y 类型之一。 function(str) {return str.length;} 具有 Function String Int 或更简洁的类型,String -> Int
  • 当 propEq 接受 2 个字符串作为参数并返回布尔值时,为什么会有 String → a → Object → Boolean 的签名?不应该是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,String → a → Object → Boolean 似乎等同于(String → a → Object) → Boolean
  • Ramda 的 curry in 版本意味着这些都是等价的:propEq('x') (42)(obj)propEq('x')(42, obj) propEq('x', 42) (obj)propEq('x', 42, obj)。所有中间形式都是(柯里化的)函数。如果最终输出也是一个函数,它会用括号括起来:comp :: (b -> c) -> (a -> b) -> (a -> c) 接受两个函数并返回第三个。
猜你喜欢
  • 2018-04-25
  • 2013-12-24
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多