Functional programming Immutable.js数据结构是函数吗?

Functional programming Immutable.js数据结构是函数吗?,functional-programming,immutability,functor,immutable.js,Functional Programming,Immutability,Functor,Immutable.js,Immutable.js数据结构是函数吗 我的直觉是肯定的: Map({ a: 1, b: 2 }).map(x => 10 * x) // Map { a: 10, b: 20 } 我正在寻找关于Immutable.js结构是函子的程度的深入解释。它们是否同时遵循身份和构成法则?是所有的集合函子,还是仅仅是映射,列表,以及序列?任何支持映射方法的东西都应该真正遵守身份法则。集合只是暂时的函子:您必须假设所涉及的相等性测试足够严格。如果可以以任何方式区分“相等”的要素,那么构成法则就会失

Immutable.js数据结构是函数吗

我的直觉是肯定的:

Map({ a: 1, b: 2 }).map(x => 10 * x)
// Map { a: 10, b: 20 }

我正在寻找关于Immutable.js结构是函子的程度的深入解释。它们是否同时遵循身份和构成法则?是所有的
集合
函子,还是仅仅是
映射
列表
,以及
序列

任何支持
映射
方法的东西都应该真正遵守身份法则。集合只是暂时的函子:您必须假设所涉及的相等性测试足够严格。如果可以以任何方式区分“相等”的要素,那么构成法则就会失败。我对JS系列一无所知,所以我不能具体地说。谢谢@dfeur!你介意扩展一下“区分“相等”元素吗?什么样的平等检查会导致和解法失败?鸭子/结构类型?[其他]打字?当然。假设你有一组数字。
Collections
集合似乎使用了
SameValueZero
相等(请参阅),它(除其他外)认为
+0
-0
相等。假设您有一个函数
f
,它将
false
转换为
-0
,将
true
转换为
+0
。假设
g
使用
SameValue
比较来测试与
-0
的相等性。如果使用
g映射集合
{True,False}
。f
,您将返回
{True,False}
。如果您使用
f
映射该集合,您将得到
{-0}
(或者可能是
{+0}
)。如果你用
g
映射这个结果,你会得到
{True}
{False}
。另一个重要的点是,当你考虑合成定律时,你必须假设你在容器上映射的函数要么没有副作用,要么有相互影响的副作用。如果
f
打印出“Hi”和
g
打印出“Bye”,那么映射构图将打印出类似“hibyehbye…”的内容,而按顺序映射每个构图将给出类似“hihibyebay”的内容。任何支持
map
方法的东西都应该真正遵守身份法则。集合只是暂时的函子:您必须假设所涉及的相等性测试足够严格。如果可以以任何方式区分“相等”的要素,那么构成法则就会失败。我对JS系列一无所知,所以我不能具体地说。谢谢@dfeur!你介意扩展一下“区分“相等”元素吗?什么样的平等检查会导致和解法失败?鸭子/结构类型?[其他]打字?当然。假设你有一组数字。
Collections
集合似乎使用了
SameValueZero
相等(请参阅),它(除其他外)认为
+0
-0
相等。假设您有一个函数
f
,它将
false
转换为
-0
,将
true
转换为
+0
。假设
g
使用
SameValue
比较来测试与
-0
的相等性。如果使用
g映射集合
{True,False}
。f
,您将返回
{True,False}
。如果您使用
f
映射该集合,您将得到
{-0}
(或者可能是
{+0}
)。如果你用
g
映射这个结果,你会得到
{True}
{False}
。另一个重要的点是,当你考虑合成定律时,你必须假设你在容器上映射的函数要么没有副作用,要么有相互影响的副作用。如果
f
打印“Hi”和
g
打印“Bye”,则映射合成将打印类似“hibyehbye…”的内容,而按顺序映射每个合成将显示类似“hibyebay”的内容。