Functional programming ImmutableJS vs Ramda或ImmutableJS+;拉姆达-它们可以一起使用吗
我正在研究这两个库,对我来说,Functional programming ImmutableJS vs Ramda或ImmutableJS+;拉姆达-它们可以一起使用吗,functional-programming,immutable.js,ramda.js,Functional Programming,Immutable.js,Ramda.js,我正在研究这两个库,对我来说,ImmutableJS具有(大部分)不可变的数据结构,而Ramda具有一组瑞士军刀FPutil 当我在谷歌上搜索时,我看到像RamdavsImmutableJS这样的文章推荐了其中一种,但乍一看,至少对我来说,它们是相辅相成的 我可以想象,我在React应用程序中的所有数据结构都是ImmutableJS(List,Set,Map,Record),但使用Ramda组合函数,在ImmutableJS集合等上进行转换,或者当我缺少一些功能时,比如uniq 你觉得怎么样?这
ImmutableJS
具有(大部分)不可变的数据结构,而Ramda
具有一组瑞士军刀FP
util
当我在谷歌上搜索时,我看到像Ramda
vsImmutableJS
这样的文章推荐了其中一种,但乍一看,至少对我来说,它们是相辅相成的
我可以想象,我在React
应用程序中的所有数据结构都是ImmutableJS
(List
,Set
,Map
,Record
),但使用Ramda
组合函数,在ImmutableJS
集合等上进行转换,或者当我缺少一些功能时,比如uniq
你觉得怎么样?这是明智的做法吗?它们可以一起使用;不顺利或不完美 就目前的情况来看,这很可能是一种方法,它会让你至少遇到一些困难,而且很可能会遇到很多困难。原因是immutable的结构与ramda的函数不兼容。您可以创建包装器或互操作来修补此功能,但这似乎是一个相当大的项目 进一步详细介绍,并包括一些immutablejs的潜在替代方案,如 下面是一个很小的例子,说明了为什么缺乏互操作性是一个问题:
const{Map}=不可变;
常数{path}=R;
常量standardObject={a:1,b:2,c:3};
const map1=不可变的.Map(standardObject);
const getA=path(['a']);
const result=getA(map1);
const defaultResult=getA(标准对象);
console.dir(结果);
console.dir(defaultResult)代码>
Ramda提供了部分免费集成。Ramda将其许多调用委托给数据对象。通常,如果Ramda函数的名称与不可变方法的名称相同,则Ramda将执行集成
这意味着您可以在通常使用数组或对象的情况下,将不可变列表或映射与Ramda一起使用
const{Map,List}=不可变
常量{map,过滤器,find}=ramda
常数平方=n=>n*n
常量isEven=n=>n%2==0
const xs=新列表([1,2,3,4,5])
log(map(square,xs))/=>List[1,4,9,16,25]
log(filter(isEven,xs))/=>List[2,4]
log(查找(n=>n>3,xs))/=>3
常数x=新映射({a:1,b:2,c:3,d:4,e:5});
控制台日志(地图(方形,x))
//=>映射{“a”=>1,“b”=>4,“c”=>9,“d”=>16,“e”=>25}
log(filter(isEven,x))/=>Map{“c”=>3,“d”=>4,“e”=>5}
我想问题在于Ramda不能处理ImmtuableJS类型。您要么需要一个兼容性包装器,要么必须坚持使用IJS组合器,并作为最后手段处理从IJS到JS对象类型的转换(这是Ramda期望的)。非常感谢!名单看起来不错。您知道地图/记录的任何类似LIB吗?它不会改变这一点,但请注意这里使用R.path
是错误的。它应该是prop('a')
或path(['a'])
。这只是巧合,因为'a'
的长度为1,'a'[0]
只是'a'
@ScottSauyet非常感谢您指出这一点!我已经更新了答案now@dragonfly恐怕我不知道还有其他这样的图书馆<代码>列表
内置ramda兼容性似乎相当不寻常。我已经编辑了答案,其中包含了一些关于如何使用拉姆达的Map
等的细节