我一直在阅读传感器并尝试掌握这个概念。我现在有点理解它们了,但是在我摆弄的过程中,我遇到了一些非常奇怪的东西,让我目瞪口呆。我希望有人能解释我所缺少的。
我有 2 个具有签名的传感器:reducer -> reducer
我还有一个简单的撰写功能:const compose = (f, g) => x => f(g(x))
当我组成 2 个换能器时:
const filterLessThanThreeAndMultiply = compose(
filteringReducer(lessThanThreePredicate),
mappingReducer(multiplyTransform)
)
我希望评估是从右到左,在这种情况下,在过滤之前应用映射变换。相反,首先应用过滤(给出预期的答案)。
但是 f(g(x)) 运行 g(x) 的结果 f,所以我的结果应该反映:
filteringReducer(lessThanThreePredicate)(mappingReducer(multiplyTransform)
(concatTransducer))
但相反,它反映了(正确):
mappingReducer(multiplyTransform)(filteringReducer(lessThanThreePredicate)
(concatTransducer))
(见下面的代码)
为什么??!!(我怀疑一旦有人向我解释这里发生的事情,我的理解就会发生巨大的飞跃)。
const filteringReducer = predicate => transducer => (result, input) =>
predicate(input) ? transducer(result, input) : result
const mappingReducer = transform => transducer => (result, input) =>
transducer(result, transform(input))
const compose = (f, g) => x => f(g(x))
const concatTransducer = (a, b) => a.concat([b])
const lessThanThreePredicate = x => x < 3
const multiplyTransform = x => x * 100
const filterLessThanThreeAndMultiply = compose(
filteringReducer(lessThanThreePredicate),
mappingReducer(multiplyTransform)
)
const result = [-2, -1, 0, 1, 2, 3, 4].reduce(
filterLessThanThreeAndMultiply(concatTransducer),
[]
)
console.log('result ', result) // [-200, -100, 0, 100, 200]