J. *_*Doe 3 javascript ramda.js
chain()(来自ramda包)和map()Javascript 之间有什么区别?
在这两个函数中,程序员输入一个对象和一些lambda /函数,并对其进行一定的计算.谢谢.
chain和map每个上的抽象类型进行操作. map适用于任何Functor.这是具有map遵守某些法律的功能的任何项目. chain在Chain元素上运行.同样,这是具有合法chain功能的东西,同时具有合法性apply和map功能性.
Ramda提供map和chain将与类型履行这些合同的工作职能.它还为某些内置类型(函数,数组和对象map以及函数和数组)提供实现chain.
要了解它们的不同之处,比较它们的签名就足够简单了:
// map :: Functor f => (a ? b) ? f a ? f b
// chain :: Chain m => (a ? m b) ? m a ? m b
Run Code Online (Sandbox Code Playgroud)
您可以这样考虑:提供的函数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]
Run Code Online (Sandbox Code Playgroud)
或者,如果我们有一个Maybe类型用于简化使用子类型的空值处理Just来表示值并Nothing在计算中表示某些null.我们可能会编写一个安全的平方根函数,如
const sqrt = (n) => n > 0 ? Just(Math.sqrt(n)) : Nothing()
Run Code Online (Sandbox Code Playgroud)
然后我们看到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
Run Code Online (Sandbox Code Playgroud)
最后,对于函数,由于另一个SO答案中描述的原因,
map(f, g) //~> x => f(g(x));
chain(f, g) //~> x => f(g(x))(x);
Run Code Online (Sandbox Code Playgroud)
您可以从他们的签名中看到,map和之间存在某种关系chain,但它们是不同的功能,用于非常不同的目的. chain与有时被称为有关的东西有关flatMap,因为它使得由此产生的那种结果变平(一级)map.
但考虑它们的最佳方式是查看与这些功能相关的签名和法律.
| 归档时间: |
|
| 查看次数: |
667 次 |
| 最近记录: |