首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Ramda编写无指针的函数式JS

如何使用Ramda编写无指针的函数式JS
EN

Stack Overflow用户
提问于 2018-06-03 17:04:46
回答 2查看 279关注 0票数 3

我有一个对象数组

代码语言:javascript
复制
const myNumbers = [
  {
   top: 10,
   bottom: 5,
   rate: 5
  },
  {
   top: 9,
   bottom: 4,
   rate: 3
  },
];

在我对数字做任何事情之前,我想运行一些函数使它们变得可用;

代码语言:javascript
复制
const addTen = r.add(10);
const double = r.multiply(2);

和一个接受数字并做一些数学运算的函数:

代码语言:javascript
复制
const process = (top, bottom, rate) => r.multiply(r.subtract(bottom, top), rate)

所以我的最后一个函数看起来像这样

代码语言:javascript
复制
muNymbers.map(({ top, bottom, rate }) =>
  process(addTen(top), double(bottom), rate)
);

只要看一下这段代码,你就会发现这两个函数已经变得非常嵌套,而且不是特别清晰。我真正的问题再次变得稍微复杂一些,我正在努力了解在为不同的操作选择不同的值时,如何才能使这一点变得不重要。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-03 20:00:37

这里是一种无分点的方法。您要查找的主要函数是pipeevolveconverge。我不确定这是不是最好的方法,这是我能想到的最好的方法:

代码语言:javascript
复制
const { add, converge, evolve, map, multiply, pipe, prop, subtract } = R;

const myNumbers = [
    { top: 10, bottom: 5, rate: 5 },
    { top: 9, bottom: 4, rate: 3 },
];

const process = pipe(

    evolve({
        top: add(10),
        bottom: multiply(2),
    }),

    converge(multiply, [

        converge(subtract, [
            prop('bottom'),
            prop('top'),
        ]),

        prop('rate'),
    ]),
);

console.log(map(process, myNumbers));
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>

票数 4
EN

Stack Overflow用户

发布于 2018-06-04 02:40:02

如果这是一个编写无指针代码的练习,像@JeffreyWesterkamp这样的解决方案是很好的。

然而,对于生产代码,任何无指针的解决方案都将比这个简单版本的可读性差得多:

代码语言:javascript
复制
const process = ({top, bottom, rate}) => ((2 * bottom) - (10 + top)) * rate;

const myNumbers = [
    { top: 10, bottom: 5, rate: 5 },
    { top: 9, bottom: 4, rate: 3 },
];

console.log(R.map(process, myNumbers));
代码语言:javascript
复制
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>

重点是不要迷恋无关紧要的东西。它是一个工具,有时使代码更容易阅读,更容易理解。但如果它不这样做,它就不值得使用。

别误会我的意思。我是无指针代码的铁杆粉丝,Ramda (免责声明:我是它的作者之一)有一些有用的工具来帮助你编写它。但是Ramda在其他代码中工作得很好。所以要明智地使用它。

还有一点(嗯):Ramda提供了两个非常不寻常的函数,useWithconverge,使编写无指针代码变得更容易。但是converge通常可以被更标准的lift所取代。它不能总是被替换,因为它有一些lift不提供的处理可变函数的特性,但是当您可以使用lift时,我建议您这样做。例如,它不是

代码语言:javascript
复制
converge(subtract, [prop('bottom'), prop('top')])

你可以这样写

代码语言:javascript
复制
lift(subtract)(prop('bottom'), prop('top'))

据我所知,目前还没有useWith的标准替代品。但只要有可能,我都会用lift替换converge

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50664808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档