Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming ImmutableJS vs Ramda或ImmutableJS+;拉姆达-它们可以一起使用吗_Functional Programming_Immutable.js_Ramda.js - Fatal编程技术网

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
vs
ImmutableJS
这样的文章推荐了其中一种,但乍一看,至少对我来说,它们是相辅相成的

我可以想象,我在
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
等的细节