与有效使用换能器相比,连锁图,过滤器等效率不高。
圣所的文件规定:
几个Ramda函数充当换能器。保护区不提供对换能器的支持。
在圣所中创建和使用换能器的推荐方法是什么?是否有配套库,还是我们要编写自己的映射,过滤等抽象以及我们自己的转换器帮助程序功能。
答案 0 :(得分:0)
您可以创建一个基于Maybe
的虚假过滤器,该过滤器可以与常规映射器组成:
const filter = pred => x => {
const result = pred(x);
return result ? S.Just(x) : S.Nothing
};
如果您组合了这些类型的过滤器并映射到数组上,则会得到:
const double = x => x * 2;
const isOdd = x => x % 2 === 1;
const doubleTheOdds = S.compose (S.map(double)) (filter(isOdd));
S.map (doubleTheOdds) ([1, 2, 3, 4, 5]);
// logs [ Just (2), Nothing, Just (6), Nothing, Just (10) ]
然后,您可以使用其他Nothing
或filter
过滤掉S.justs
。我猜这不是一个“真实”的转换器,因为:
Just
值map
上调用Nothing
会产生一些开销这是完整的代码示例,您可以here运行它
const S = require('sanctuary');
const isOdd = x => x % 2 === 1;
const double = x => x * 2;
// Create a filter that returns Nothing / Just(value) instead of boolean
const filter = f => x => {
const result = f(x);
return result ? S.Just(x) : S.Nothing
};
const doubleTheOdds = S.compose (S.map(double)) (filter(isOdd));
const runTransducer = transducer => xs => S.justs (S.map (transducer) (xs))
runTransducer (doubleTheOdds) ([1, 2, 3, 4, 5]); // [2, 6, 10]
P.S。上次我为解决该问题而苦恼时,user633183给予了我帮助。您绝对应该阅读其中的一些excellent answers on transducers。