繁体   English   中英

Ramda:如何将普通应用程序转换为管道或撰写

[英]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

您将如何使用pipecompose做到这一点?

编辑:

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) composepipe是相同的,只是方向执行功能有所不同。

对于新手。 我建议您阅读此电子书

据我所知,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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM