[英]Ramda: How to translate a normal application to a pipe or compose
这是一个新手问题(对于Ramda和一般的函数式编程我还是很陌生)。
我有一个带有两个参数的函数。 为了简单起见,我们假设它只是减去数字。 我想反驳它的论点。 我已经想出了手动操作的方法,但确实感觉可以通过管道或撰写来完成,但我不知道该怎么做。
import { curry, flip, pipe } from 'ramda';
const subtract = (a, b) => a - b; // subtract(1, 4); -3
const flippedCurriedSubtract = flip(curry(subtract))
// flippedCurriedSubtract(1)(4); 3
pipe(flip, curry, subtract)(1)(4); // NaN
您将如何使用pipe
或compose
做到这一点?
编辑:
pipe(
curry,
flip
)(subtract); // works
pipe(flip, curry, subtract)(1)(4)
等于subtract(curry(flip(1)(4)))
同时定义flip
:
// flip :: (a -> b -> c) -> b -> a -> c
const flip = curry((fn, a, b) => fn(b, a));
这意味着flip
函数将使用curry
函数(a-> b-> c)作为参数,但是现在它变成一个数字然后导致错误。
pipe(curry,flip)(subtract)
等于flip(curry(subtract))
,这将适合。 它还使用.compose(flip, curry)(subtract)
返回相同的.compose(flip, curry)(subtract)
。 compose
和pipe
是相同的,只是方向执行功能有所不同。
对于新手。 我建议您阅读此电子书
据我所知,Ramda中的大多数功能已经被管理。 因此,您无需再次咖喱减法。
subtract(5, 10); //=> -5
subtract(5)(10); //=> -5
您可以flip
它,它仍然会被咖喱处理:
flip(subtract)(5, 10); //=> 5
flip(subtract)(5)(10); //=> 5
我认为您根本不需要烟斗和咖喱,您可以这样做:
const flippedSubtract = flip(subtract);
flippedSubtract(5)(10); //=> 5
斯科特(Scott)在评论中指出, flip
将自动咖喱非咖喱函数:(非常有用)
const foo = (a, b, c) => `foo: ${a}${b}${c}`;
foo('x', 'y', 'z'); //=> 'foo: xyz'
flip(foo)('x')('y')('z'); //=> 'foo: yxz'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.