chain()
和有什么区别(来自 ramda
包)和 map()
在 Javascript 中?
在这两个函数中,程序员都输入一个对象和一些 lambda/函数,并对其进行一定的计算。谢谢。
最佳答案
抽象类型chain
和 map
每个都对抽象类型进行操作。 map
在任何 上运行Functor .这是带有 map
的任何项目遵循一定规律的功能。 chain
在 上运行Chain 元素。同样,这是合法的 chain
功能,以及合法的apply
和 map
功能。
Ramda 提供 map
和 chain
将与履行这些契约(Contract)的类型一起使用的函数。它还提供某些内置类型的实现(map
的函数、数组和对象以及 chain
的函数和数组。)
要了解它们的不同之处,比较它们的签名很简单:
// 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 的容器。chain
接受该函数和持有类型 A 的容器,返回持有类型 B 的容器。您可以将其视为
chain
与 map
相比,打开一层容器.一些例子
例如,假设我们有一个函数
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]
或者如果我们有一个
Maybe
用于简化子类型 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
最后,对于函数,原因在 中描述。 another SO answer ,
map(f, g) //~> x => f(g(x));
chain(f, g) //~> x => f(g(x))(x);
概括
从他们的签名中可以看出,
map
之间存在某种关系。和 chain
,但它们是不同的功能,用于非常不同的目的。 chain
与有时称为 flatMap
的内容有关,因为它使 map
创建的那种结果变平(一层) .但考虑它们的最佳方式是查看与这些功能相关的签名和定律。
关于javascript - ramda.js中chain()和map()的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49861293/