functional-programming - ImmutableJS vs Ramda 或 ImmutableJS + Ramda - 它们可以一起使用吗
问题描述
我正在探索这两个库,对我来说ImmutableJS
(大部分)具有不可变的数据结构,而Ramda
瑞士军刀有一组FP
实用程序。
当我用谷歌搜索时,我会看到类似Ramda
vs的文章ImmutableJS
推荐其中一个,但乍一看,至少在我看来,它们是相辅相成的。
我可以想象我在React
应用程序中的所有数据结构都是ImmutableJS
( List
, Set
, Map
, Record
) 但用于Ramda
组合函数、对ImmutableJS
集合进行转换等或当我错过一些功能时,例如uniq
.
你怎么看?这是明智的做法吗?
解决方案
它们可以一起使用吗?不顺利或无缝。
就目前的情况而言,这很可能是一种方法,至少会导致您遇到一些困难,而且很可能会遇到很大的困难。原因是 immutable 的结构与 ramda 的功能不兼容。您可能能够创建包装器或互操作来修补此功能,但这似乎是一个相当大的项目。
这个问题更详细,包括一些 immutablejs 的潜在替代品,例如List。
这是一个非常小的示例,说明为什么缺乏互操作性是一个问题:
const { Map } = Immutable;
const { path } = R;
const standardObject = {a: 1, b: 2, c: 3};
const map1 = Immutable.Map(standardObject);
const getA = path(['a']);
const result = getA(map1);
const defaultResult = getA(standardObject);
console.dir(result);
console.dir(defaultResult);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.2/immutable.js"></script>
您大概可以将转换构建到您在 ramda 中所做的工作中;这似乎是解决问题的最简单方法,尽管它确实意味着您将代码非常紧密地绑定到不可变数据结构。这可能像这样工作:
const { Map } = Immutable;
const { path, pipe } = R;
const standardObject = {a: 1, b: 2, c: 3};
const map1 = Immutable.Map(standardObject);
const toStandard = map => map.toObject()
const getA = pipe(
toStandard,
path(['a'])
)
const result = getA(map1)
console.dir(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.2/immutable.js"></script>
推荐阅读
- asp.net-core - 如何使用 EF 以实体的形式获取嵌套查询的结果
- tensorflow - 在张量流中进行优化
- ruby-on-rails - 如何创建由 Ruby on Rails 支持的用户/事件跟踪工具
- enums - 给定保留字段标签的 proto2 中的默认枚举值是多少?
- git - 推送不属于我的 github
- python - Python乘法,对不同长度的数组求和:优化代码
- django - Django-filter 和 Django-tables2 过滤器,ModelChoice 值未过滤
- android - 凌空不工作并在样品请求中出错
- google-bigquery - 无法以任何格式保存 GBQ 结果
- r - 多边形内的人口密度