Pointfree 动态函数组合
Pointfree dynamic function composition
我正在尝试将此函数重构为无点。
function siblings(me) {
return R.pipe(family, R.reject(equalsMe(me)))(me);
}
我想将 me
连同 family
returns.
的值一起传递给管道中的函数
用 R.useWith
或 R.converge
和 R.identity
或 R.__
尝试了一些东西(甚至不确定我是否应该使用它)但没有发现任何工作。
如果您使用 R.without(如 中的建议),您可以使用 R.chain 并翻转 R.without:
chain(flip(without), withFamily);
因为chain(f, g)(x)
等同于f(g(x), x)
:
chain(flip(without), withFamily)(me)
等于:
flippedWithout(withFamily(me), me)
示例:
const { always, chain, flip, without } = R;
const withFamily = always(['fratello', 'sorella', 'io']);
const siblingsOf = chain(flip(without), withFamily);
console.log(
siblingsOf('io'),
);
console.log(
siblingsOf('sorella'),
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.js" integrity="sha512-3sdB9mAxNh2MIo6YkY05uY1qjkywAlDfCf5u1cSotv6k9CZUSyHVf4BJSpTYgla+YHLaHG8LUpqV7MHctlYzlw==" crossorigin="anonymous"></script>
如果我理解正确的话 family
是一个需要一个人和 returns 家庭成员列表(包括那个人)的函数,例如
family(2);
//=> [1, 2, 3]
然后你想创建一个函数 siblings
它需要一个人和 returns 只有他们的兄弟姐妹,例如
siblings(2);
//=> [1, 3]
我个人认为如果这样写你的函数会稍微好读一些:
const siblings = me => reject(equals(me), family(me));
siblings(2);
//=> [1, 3]
如果您真的想要它的无点版本,您可以使用converge
,但我真的不认为更好:
const siblings = converge(reject, [unary(equals), family]);
我还建议使用 R.converge
并将 R.reject(equalsMe(me))
与 R.without(me)
交换
const withFamily = R.always(['fratello', 'sorella', 'io']);
const siblingsOf = R.converge(R.without, [
R.identity,
withFamily,
]);
console.log(
siblingsOf('io'),
);
console.log(
siblingsOf('sorella'),
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.js" integrity="sha512-3sdB9mAxNh2MIo6YkY05uY1qjkywAlDfCf5u1cSotv6k9CZUSyHVf4BJSpTYgla+YHLaHG8LUpqV7MHctlYzlw==" crossorigin="anonymous"></script>
我正在尝试将此函数重构为无点。
function siblings(me) {
return R.pipe(family, R.reject(equalsMe(me)))(me);
}
我想将 me
连同 family
returns.
用 R.useWith
或 R.converge
和 R.identity
或 R.__
尝试了一些东西(甚至不确定我是否应该使用它)但没有发现任何工作。
如果您使用 R.without(如
chain(flip(without), withFamily);
因为chain(f, g)(x)
等同于f(g(x), x)
:
chain(flip(without), withFamily)(me)
等于:
flippedWithout(withFamily(me), me)
示例:
const { always, chain, flip, without } = R;
const withFamily = always(['fratello', 'sorella', 'io']);
const siblingsOf = chain(flip(without), withFamily);
console.log(
siblingsOf('io'),
);
console.log(
siblingsOf('sorella'),
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.js" integrity="sha512-3sdB9mAxNh2MIo6YkY05uY1qjkywAlDfCf5u1cSotv6k9CZUSyHVf4BJSpTYgla+YHLaHG8LUpqV7MHctlYzlw==" crossorigin="anonymous"></script>
如果我理解正确的话 family
是一个需要一个人和 returns 家庭成员列表(包括那个人)的函数,例如
family(2);
//=> [1, 2, 3]
然后你想创建一个函数 siblings
它需要一个人和 returns 只有他们的兄弟姐妹,例如
siblings(2);
//=> [1, 3]
我个人认为如果这样写你的函数会稍微好读一些:
const siblings = me => reject(equals(me), family(me));
siblings(2);
//=> [1, 3]
如果您真的想要它的无点版本,您可以使用converge
,但我真的不认为更好:
const siblings = converge(reject, [unary(equals), family]);
我还建议使用 R.converge
并将 R.reject(equalsMe(me))
与 R.without(me)
const withFamily = R.always(['fratello', 'sorella', 'io']);
const siblingsOf = R.converge(R.without, [
R.identity,
withFamily,
]);
console.log(
siblingsOf('io'),
);
console.log(
siblingsOf('sorella'),
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.js" integrity="sha512-3sdB9mAxNh2MIo6YkY05uY1qjkywAlDfCf5u1cSotv6k9CZUSyHVf4BJSpTYgla+YHLaHG8LUpqV7MHctlYzlw==" crossorigin="anonymous"></script>