如何将普通应用程序转换为管道或组合

How to translate a normal application to a pipe or compose

我有一个带有两个参数的函数。为了简单起见,我们假设它只是减去数字。我想反驳和讨好它的论点。我已经想出了如何手动完成它,但感觉真的可以用管道或组合来完成,但我不知道怎么做。

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)),这将适合。 它也 returns 与 .compose(flip, curry)(subtract) 相同。 composepipe是一样的,只是方向执行函数不同而已。

对于新手。我推荐你阅读这个 ebook

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