gpt4 book ai didi

javascript - Immutable.js 数据结构的自定义相等语义

转载 作者:数据小太阳 更新时间:2023-10-29 03:57:08 24 4
gpt4 key购买 nike

我想要Sanctuary提供Fantasy Land -具有基于值的相等语义的兼容 Map 和 Set 类型。理想情况下,这些值是不可变的,但这并不重要,因为 Sanctuary 会提供用于合并和以其他方式操纵这些值的纯函数。

我很乐意利用 Immutable.js 所做的出色工作团队;我想实现持久数据结构需要付出相当大的努力!

Immutable.js 提供的 API 并不重要,因为 Sanctuary 会公开与这些值交互的函数。不过,这些类型的相等语义至关重要。

这对我的用例来说是 Not Acceptable :

> Map([[[1, 2, 3], 'foo'], [[1, 2, 3], 'bar']])
Map { [1,2,3]: "foo", [1,2,3]: "bar" }

[1, 2, 3][1, 2, 3] 的值相同。不应该有两个具有相同键的映射条目。

-0的处理也是有问题的:

> Immutable.is(Map([[0, 0]]), Map([[-0, -0]]))
true

我意识到可以通过定义 equals 方法来定义自己类型的相等语义,但我希望重新定义原生类型(例如 Array 和 Number)的相等语义。 这可能吗?相关文件似乎是is.js ,但我看不到自定义的钩子(Hook)。

Sanctuary 的 Map 类型可能会包装 Immutable.js Map 类型。这将提供:

  • 一种处理-0的方法;
  • 有机会在执行 assoc 之前执行基于值的相等性检查通常会导致重复 key 的操作;和
  • 定义各种fantasy-land/方法的地方。

也许:

Map k v = { negativeZero :: Maybe v
, value :: ImmutableMap k v
, fantasy-land/equals :: Map k v ~> Map k v -> Boolean
, fantasy-land/map :: Map k v ~> (k -> a) -> Map a v
, fantasy-land/bimap :: Map k v ~> (k -> a, v -> b) -> Map a b
, ...
}

在创建上述包装器之前,我想确定没有其他方法可以获得所需的相等语义。 facebook/immutable-js#519没有希望。

最佳答案

虽然很久以前有人问过这个问题,但我没有看到对这个简单解决方案的引用:

const {Map, fromJS} = Immutable

// instead of this:
console.log(
Map([[[1, 2, 3], 'foo'], [[1, 2, 3], 'bar']]).toString(),
)

// do this:
console.log(
Map(fromJS([[[1, 2, 3], 'foo'], [[1, 2, 3], 'bar']])).toString()
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/4.0.0-rc.12/immutable.min.js"></script>

通过使用 fromJS 深度转换对象你得到了值(value)平等

关于javascript - Immutable.js 数据结构的自定义相等语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39557342/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com