Pointfree 动态函数组合

AKG*_*AKG 5 javascript functional-programming pointfree ramda.js

我正在尝试将此函数重构为无点。

function siblings(me) {
  return R.pipe(family, R.reject(equalsMe(me)))(me);
}
Run Code Online (Sandbox Code Playgroud)

我想通过me管道传递给一个函数以及family返回的值。

R.useWithR.convergeR.identity或尝试了一些东西R.__(甚至不确定我是否应该使用它)但发现没有任何效果。

Hit*_*nds 7

我也建议使用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'),
);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.js" integrity="sha512-3sdB9mAxNh2MIo6YkY05uY1qjkywAlDfCf5u1cSotv6k9CZUSyHVf4BJSpTYgla+YHLaHG8LUpqV7MHctlYzlw==" crossorigin="anonymous"></script>
Run Code Online (Sandbox Code Playgroud)


Ori*_*ori 6

如果您使用的是 R.without(如Hitmands answer 中所建议的),您可以将 R.chain 与翻转的 R.without 一起使用:

chain(flip(without), withFamily);
Run Code Online (Sandbox Code Playgroud)

因为chain(f, g)(x)相当于f(g(x), x)

chain(flip(without), withFamily)(me)
Run Code Online (Sandbox Code Playgroud)

等于:

flippedWithout(withFamily(me), me)
Run Code Online (Sandbox Code Playgroud)

例子:

chain(flip(without), withFamily);
Run Code Online (Sandbox Code Playgroud)
chain(flip(without), withFamily)(me)
Run Code Online (Sandbox Code Playgroud)


cus*_*der 6

如果我理解正确的family是一个函数,它接受一个人并返回一个家庭成员(包括那个人)的列表,例如

family(2);
//=> [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

然后你想创建一个函数siblings,它接受一个人并只返回他们的兄弟姐妹,例如

siblings(2);
//=> [1, 3]
Run Code Online (Sandbox Code Playgroud)

就我个人而言,我认为你的函数如果这样写会更好读一点:

const siblings = me => reject(equals(me), family(me));

siblings(2);
//=> [1, 3]
Run Code Online (Sandbox Code Playgroud)

如果你真的想要一个 pointfree 版本,你可以使用,converge但我真的不认为它更好:

const siblings = converge(reject, [unary(equals), family]);
Run Code Online (Sandbox Code Playgroud)