dav*_*ers 9 javascript functional-programming immutable.js sanctuary
我希望Sanctuary能够提供与Fantasy Land兼容的Map和Set类型以及基于值的等式语义.理想情况下,这些值是不可变的,尽管这并不重要,因为Sanctuary将提供用于合并和操纵这些值的纯函数.
我很乐意利用Immutable.js团队所做的出色工作; 我想实现持久数据结构需要相当大的努力!
由于Sanctuary会公开与这些值交互的函数,因此Immutable.js提供的API并不重要.但是,这些类型的等同语义至关重要.
这对我的用例来说是不可接受的:
> Map([[[1, 2, 3], 'foo'], [[1, 2, 3], 'bar']])
Map { [1,2,3]: "foo", [1,2,3]: "bar" }
Run Code Online (Sandbox Code Playgroud)
[1, 2, 3]是一样的价值[1, 2, 3].不应该有两个具有相同键的映射条目.
处理-0也存在问题:
> Immutable.is(Map([[0, 0]]), Map([[-0, -0]]))
true
Run Code Online (Sandbox Code Playgroud)
我意识到可以通过定义equals方法来定义自己类型的相等语义,但我希望重新定义本机类型(如Array和Number)的相等语义.这可能吗?相关文件似乎是is.js,但我看不到自定义的钩子.
Sanctuary的Map类型可能会包装Immutable.js Map类型.这将提供:
-0;assoc通常会导致重复键的操作之前执行基于值的相等性检查的机会; 和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
, ...
}
Run Code Online (Sandbox Code Playgroud)
我想确保在创建如上所述的包装器之前没有其他方法可以获得所需的相等语义.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()
)Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/4.0.0-rc.12/immutable.min.js"></script>Run Code Online (Sandbox Code Playgroud)
通过使用fromJS深度转换对象,您可以获得值相等