Functional programming Immutable.js数据结构是函数吗?
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结构是函子的程度的深入解释。它们是否同时遵循身份和构成法则?是所有的集合函子,还是仅仅是映射,列表,以及序列?任何支持映射方法的东西都应该真正遵守身份法则。集合只是暂时的函子:您必须假设所涉及的相等性测试足够严格。如果可以以任何方式区分“相等”的要素,那么构成法则就会失
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”的内容。