Javascript ramda.js中chain()和map()的区别

Javascript ramda.js中chain()和map()的区别,javascript,ramda.js,Javascript,Ramda.js,Javascript中的chain()(来自ramda包)和map()之间有什么区别 在这两个函数中,程序员输入一个对象和一些lambda/函数,并对其进行一定的计算。谢谢。抽象类型 chain和map都对抽象类型进行操作映射对任何操作。这是任何具有map功能且遵守某些规则的项目链在元素上运行。类似地,这是具有合法的链功能,以及合法的应用和映射功能的东西 Ramda提供了map和chain函数,这些函数将与履行这些契约的类型一起工作。它还提供某些内置类型的实现(用于map的函数、数组和对象,以及

Javascript中的
chain()
(来自
ramda
包)和
map()
之间有什么区别

在这两个函数中,程序员输入一个对象和一些lambda/函数,并对其进行一定的计算。谢谢。

抽象类型
chain
map
都对抽象类型进行操作<代码>映射对任何操作。这是任何具有
map
功能且遵守某些规则的项目<代码>链在元素上运行。类似地,这是具有合法的
功能,以及合法的
应用
映射
功能的东西

Ramda提供了
map
chain
函数,这些函数将与履行这些契约的类型一起工作。它还提供某些内置类型的实现(用于
map
的函数、数组和对象,以及用于
链的函数和数组)

要了解它们之间的区别,比较它们的签名非常简单:

// map   :: Functor f => (a → b)   → f a → f b
// chain :: Chain   m => (a → m b) → m a → m b
您可以这样考虑:提供给
map
的函数接受类型为A的项并返回类型为B的项。
map
接受该函数和类型为A的容器,并返回类型为B的容器。相反,提供给
chain
的函数接受类型为A的项并返回类型为B的容器保持类型B。
接受该函数和保持类型a的容器,返回保持类型B的容器

您可以将其视为与
map
相比,
chain
打开一级容器

一些例子 例如,假设我们有一个函数
factors
,它返回整数的因子(
factors(14)/=>[1,2,7,14]
),下面是
map
chain
如何处理数字列表:

map(factors, [12, 15])   //=> [[1, 2, 3, 4, 6, 12], [1, 3, 5, 15]]
chain(factors, [12, 15]) //=> [1, 2, 3, 4, 6, 12, 1, 3, 5, 15]
或者,如果我们有一个
类型,可以使用
子类型简化空值处理
Just
来表示一个值,
Nothing
来表示计算中的一些空值。我们可以编写一个安全的平方根函数,例如

const sqrt = (n) => n > 0 ? Just(Math.sqrt(n)) : Nothing()
然后我们看到
map
chain
之间的这些差异

map(sqrt, Just(25)) //=> Just(Just(5))
chain(sqrt, Just(25)) //=> Just(5)

map(sqrt, Just(-25)) //=> Just(Nothing)
chain(sqrt, Just(-25)) //=> Nothing
最后,对于函数,由于中描述的原因

map(f, g)   //~> x => f(g(x));
chain(f, g) //~> x => f(g(x))(x); 
总结 从它们的签名中可以看出,
map
chain
之间存在某种关系,但它们是不同的函数,用于非常不同的目的<代码>链
与有时被称为
flatMap
的内容相关,因为它将
map
创建的结果类型(一个级别)展平


但考虑这些功能的最佳方式是查看与这些功能相关的签名和法律。

2019年8月更新

完全同意斯科特的回答;)希望通过比较添加一个简单的示例。假设你有一群朋友,他们都有几种最喜欢的食物。我们可以使用chain(又名flatMap)来创建一个包含所有你应该在下次聚会上提供的食物的数组

import * as R from "ramda";

const friends = [
  {
    name: "Jill",
    favoriteFoods: ["pizza", "hummus"]
  },
  {
    name: "Bob",
    favoriteFoods: ["ice cream"]
  },
  {
    name: "Alice",
    favoriteFoods: ["chicken wings", "salmon"]
  }
];

let favouriteFoods = R.map(friend => friend.favoriteFoods);

console.log(favouriteFoods(friends));
//-> [ [ 'pizza', 'hummus' ], [ 'ice cream' ], [ 'chicken wings', 'salmon' ] ]



favouriteFoods = R.chain(friend => friend.favoriteFoods);

console.log(favouriteFoods(friends));
//-> [ 'pizza', 'hummus', 'ice cream', 'chicken wings', 'salmon' ]

一种常见的模式是将展平函数与映射函数相结合。您可以显式映射,然后在两个单独的步骤中展平。不过,Chain对你来说两者都有作用。

Chain
不是数组上的原生JS方法。prototype
Chain
来自Ramdac。你可以用这些知识和标记编辑你的问题,这样人们就不会感到困惑了,请?@SterlingArcher我理解。但除此之外,这些函数是等价的吗?根据编号“chain将函数映射到一个列表上并连接结果。chain在某些库中也称为flatMap”