当需要输入来构建管道时,如何编写函数?
How can I compose functions when the input is needed to build the pipeline?
我正在尝试使用 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
接受一个正则表达式和一个字符串,定位字符串中的第一个匹配项,然后 returns 匹配项左侧的所有内容。最后一行的计算结果为 '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');
是否有更简洁或更优雅的方式来处理在将数据输入管道之前需要使用数据构建管道的情况?
你的组合看起来很乱的原因是你正在组合一个二元函数 search
和一个三元函数 substring
。更糟糕的是,"piped" 参数发生在三元函数
的中间
_ search(/ /, s)
/
substring(0, /, s)
与其担心无点,我只想编写最能表达它的函数
const lSplit = (pat, s) => substring(0, search(pat,s), s);
它并不聪明,但它是可读的。我的建议是顺其自然。
我正在尝试使用 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
接受一个正则表达式和一个字符串,定位字符串中的第一个匹配项,然后 returns 匹配项左侧的所有内容。最后一行的计算结果为 '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');
是否有更简洁或更优雅的方式来处理在将数据输入管道之前需要使用数据构建管道的情况?
你的组合看起来很乱的原因是你正在组合一个二元函数 search
和一个三元函数 substring
。更糟糕的是,"piped" 参数发生在三元函数
_ search(/ /, s)
/
substring(0, /, s)
与其担心无点,我只想编写最能表达它的函数
const lSplit = (pat, s) => substring(0, search(pat,s), s);
它并不聪明,但它是可读的。我的建议是顺其自然。