【发布时间】:2017-11-27 00:39:20
【问题描述】:
我一直在阅读有关传感器的信息,并尝试掌握这个概念。我现在有点理解它们了,但是在我摆弄的过程中,我遇到了一些非常奇怪的东西,让我目瞪口呆。我希望有人能解释我错过了什么。
我有 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]
【问题讨论】:
-
也许单步调试器?
-
我怀疑没有办法简化代码——它已经被简化了。比如上面
filterLessThanThreeAndMultiply的定义比写成这样简单:const filterLessThanThreeAndMultiply = filteringReducer(lessThanThreePredicate)(mappingReducer(multiplyTransform)) -
我不想简化代码。我试图理解为什么执行顺序似乎与 compose 函数所建议的相反。
标签: javascript transducer