【发布时间】:2016-06-19 01:14:38
【问题描述】:
我正在尝试使用 Ramda 库在 javascript 中学习一些函数式编程,但我不断遇到我编写一堆函数然后必须将输入传递给结果两次的情况。下面的工作代码就是一个例子:
const search = R.invoker(1, 'search');
const substring = R.invoker(2, 'substring');
const lSplit = (pat, s) => R.compose(substring(0), search(pat))(s)(s);
lSplit(/ /, 'foo bar');
lSplit 接受一个正则表达式和一个字符串,定位字符串中的第一个匹配项,并返回匹配项左侧的所有内容。最后一行计算为'foo'。有必要将s 传递给组合函数两次:第一次找到模式并构建子字符串函数,然后第二次在字符串上运行组合函数。该代码有效,但(s)(s) 似乎不优雅。
我编写了一个名为 twice 的函数,它稍微整理了一下,但并没有真正解决不优雅的问题:
const search = R.invoker(1, 'search');
const substring = R.invoker(2, 'substring');
const twice = f => d => f(d)(d);
const lSplit = pat => twice(R.compose(substring(0), search(pat)));
lSplit(/ /)('foo bar');
是否有一种更简洁或更优雅的方式来处理需要在将数据输入管道之前使用数据来构建管道的情况?
【问题讨论】:
标签: javascript functional-programming ramda.js