Sanctuary.js:推荐的制造和使用传感器的方法

时间:2019-05-27 20:01:36

标签: javascript functional-programming pointfree transducer sanctuary

与有效使用换能器相比,连锁图,过滤器等效率不高。

圣所的文件规定:

  

几个Ramda函数充当换能器。保护区不提供对换能器的支持。

在圣所中创建和使用换能器的推荐方法是什么?是否有配套库,还是我们要编写自己的映射,过滤等抽象以及我们自己的转换器帮助程序功能。

1 个答案:

答案 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) ]

然后,您可以使用其他Nothingfilter过滤掉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