Javascript ramda.js中chain()和map()的区别
Javascript中的Javascript ramda.js中chain()和map()的区别,javascript,ramda.js,Javascript,Ramda.js,Javascript中的chain()(来自ramda包)和map()之间有什么区别 在这两个函数中,程序员输入一个对象和一些lambda/函数,并对其进行一定的计算。谢谢。抽象类型 chain和map都对抽象类型进行操作映射对任何操作。这是任何具有map功能且遵守某些规则的项目链在元素上运行。类似地,这是具有合法的链功能,以及合法的应用和映射功能的东西 Ramda提供了map和chain函数,这些函数将与履行这些契约的类型一起工作。它还提供某些内置类型的实现(用于map的函数、数组和对象,以及
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方法。prototypeChain
来自Ramdac。你可以用这些知识和标记编辑你的问题,这样人们就不会感到困惑了,请?@SterlingArcher我理解。但除此之外,这些函数是等价的吗?根据编号“chain将函数映射到一个列表上并连接结果。chain在某些库中也称为flatMap”