编辑: R.useWith 非常接近您正在寻找的内容:
接受一个函数 fn 和一个转换器函数列表并返回一个新的柯里化函数。当新函数被调用时,它使用参数调用函数 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>
如果您想要与您提到的 Haskell 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);