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

标签 javascript ramda.js

chain() 和有什么区别(来自 ramda 包)和 map()在 Javascript 中?

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

最佳答案

抽象类型
chainmap每个都对抽象类型进行操作。 map在任何 上运行Functor .这是带有 map 的任何项目遵循一定规律的功能。 chain 上运行Chain 元素。同样,这是合法的 chain功能,以及合法的applymap功能。

Ramda 提供 mapchain将与履行这些契约(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 的容器。

您可以将其视为 chainmap 相比,打开一层容器.

一些例子

例如,假设我们有一个函数 factors ,它返回整数的因数(例如 factors(14) //=> [1, 2, 7, 14]。)这里是 mapchain将适用于数字列表:
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/

相关文章:

javascript - 使用 Ramda 根据条件更新嵌套值

javascript - webpack 导入所有代码而不是某些函数

javascript - 如何使用随机TOKEN通过AJAX重新加载PHP脚本,url被缓存?

javascript - 谷歌可视化 - 不兼容的数据表 : Error: Table contains more columns than expected

javascript - 使用键从集合动态创建树对象

javascript - Ramda 中 Haskell 的 const 函数的等效项

javascript - 使用不同的镜头依次将多个功能应用于对象

JavaScript 基本变量返回用户输入的值

javascript - 使用 jquery .height() 隐藏/显示 div

functional-programming - 无积分编程拼图