[英]Using Ramda, how do you compose against binary functions?
Ramda提供与R.equals
大小写相等的区分,但是我想要一个不区分大小写的相等测试。 R.compose
还提供了R.compose
,但在R.compose
组合中,假设最左边的参数是一元的。
我想做的就像是
R.compose( R.equals(...), R.toLower )
但是,我想组成R.toLower
上的二元函数R.equals
?
有没有办法实现这个目标? 类型喜欢
(b->b->c) -> (a->b) => (a->a->c)
我想要的是像Haskell的Data.Function.on
这样定义为
on buxy
运行二进制函数b,将一元函数u
应用于两个参数x
和y
。 从相反的角度来看,它可以转换两个输入并组合输出。
编辑: R.useWith
非常接近您正在寻找的:
接受函数fn和变换器函数列表,并返回一个新的curried函数。 当调用新函数时,它调用函数fn,其参数包括在新函数的连续参数上调用每个提供的处理程序的结果。
所以你可以像这样定义你的函数:
const equalsi = R.useWith(R.equals, [R.toLower, R.toLower]);
例:
const equalsi = R.useWith(R.equals, [R.toLower, R.toLower]); const check = (a, b) => console.log(`${a} = ${b}?`, equalsi(a, b)); check('aaa', 'aaa'); check('aaa', 'aa'); check('aAa', 'aaa'); check('aaa', 'aAa'); check('aba', 'aaa');
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.0/ramda.min.js"></script>
如果你想要的东西等同于哈斯克尔on
功能,你别说,你可以定义一个如下:
const on = (b, u) => R.useWith(b, [u, u]); const equalsi = on(R.equals, R.toLower); const check = (a, b) => console.log(`${a} = ${b}?`, equalsi(a, b)); check('aaa', 'aaa'); check('aaa', 'aa'); check('aAa', 'aaa'); check('aaa', 'aAa'); check('aba', 'aaa');
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.0/ramda.min.js"></script>
上一个答案 :
可能有更优雅的方式来做到这一点,但这有效:
const equalsi = R.unapply(R.compose(
R.apply(R.equals),
R.map(R.toLower)
));
打破它:
// [] -> Boolean
// Takes an array of two strings and returns true if they are equal
R.apply(R.equals)
// [] -> Boolean
// Takes an array of two strings, converts them to lowercase, and returns true
// if those lowercase strings are equal
R.compose(R.apply(R.equals), R.map(R.toLower))
// String -> String -> Boolean
// Takes two strings, converts them to lowercase, and returns true if those lowercase
// string are equal
R.unapply(R.compose(R.apply(R.equals), R.map(R.toLower)));
您还可以根据Ramda函数定义on
函数,然后使用:
const on = (b, u) => R.unapply(R.compose(R.apply(b), R.map(u));
const equalsi = on(R.equals, R.toLower);
您还可以考虑使用eqBy
:
在其域中获取一个函数和两个值,如果值映射到codomain中的相同值,则返回true; 否则是假的。
R.eqBy(R.toLower, 'a', 'A'); //=> true
例:
console.log(R.eqBy(R.toLower, 'a', 'A'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.0/ramda.min.js"></script>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.