如何将普通应用程序转换为管道或组合
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
你会如何用 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))
,这将适合。
它也 returns 与 .compose(flip, curry)(subtract)
相同。 compose
和pipe
是一样的,只是方向执行函数不同而已。
对于新手。我推荐你阅读这个 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'
我有一个带有两个参数的函数。为了简单起见,我们假设它只是减去数字。我想反驳和讨好它的论点。我已经想出了如何手动完成它,但感觉真的可以用管道或组合来完成,但我不知道怎么做。
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))
,这将适合。
它也 returns 与 .compose(flip, curry)(subtract)
相同。 compose
和pipe
是一样的,只是方向执行函数不同而已。
对于新手。我推荐你阅读这个 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'