微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pointfree 动态函数组合

如何解决Pointfree 动态函数组合

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

function siblings(me) {
  return R.pipe(family,R.reject(equalsMe(me)))(me);
}

我想将 mefamily 返回的值一起传递给管道中的函数

R.useWithR.convergeR.identityR.__ 尝试了一些东西(甚至不确定我是否应该使用它),但没有找到任何工作。>

解决方法

我还建议使用 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>

,

如果您使用的是 R.without(如 Hitmands answer 中的建议),您可以使用带有翻转 R.without 的 R.chain:

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','io']);

const siblingsOf = chain(flip(without),withFamily);

console.log(
  siblingsOf('io'),);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.js" integrity="sha512-3sdB9mAxNh2MIo6YkY05uY1qjkywAlDfCf5u1cSotv6k9CZUSyHVf4BJSpTYgla+YHLaHG8LUpqV7MHctlYzlw==" crossorigin="anonymous"></script>

,

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

family(2);
//=> [1,2,3]

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

siblings(2);
//=> [1,3]

我个人认为,如果这样编写,您的函数会读起来稍微好一点:

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

siblings(2);
//=> [1,3]

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

const siblings = converge(reject,[unary(equals),family]);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。