【发布时间】:2019-10-23 17:03:55
【问题描述】:
我读过的关于传感器的网络文章
Js
- 传感器:JavaScript 中的高效数据处理管道 @ Eric Elliott -Medium
- 了解 JavaScript @ Roman Liutikov-Medium 中的转换器
半点都难以理解……
- 什么是传感器?
- 更简单的 JavaScript 转换器
- 如何使用传感器更高效地进行数据转换
Clojure
- Rich Hickey-cognitect 即将推出传感器
- Transducers-Clojure.org
我阅读了大约 2 页的 Clojure 官方教程,并了解了基本语法。我参考了内置函数参考来理解传感器示例代码。
我对以上两篇文章的理解大概是75%...
我的问题
想知道下面的理解/js代码是对还是错。请帮帮我。
关于传感器
-
compose()返回的值是一个传感器。 - Transducer 通过作为参数传递给
transduce()函数来执行,此外,(2)Transducer 通过将数组直接传递给transducer()来执行。 -
在(2)的过程中,没有生成中间值,而是执行如下链接的高效过程。
我的代码
"use strict";
const map = fn => arr => arr.map(fn),
filter = fn => arr => arr.filter(fn),
addReducer = arr => arr.reduce((acc, num) => acc + num, 0),
add1 = n => n + 1,
even = n => n % 2 === 0,
compose = (...fns) => initVal => fns.reduce((acc, fn) => fn(acc), initVal),
transduce = (xform, reducer, arr ) => reducer( xform(arr) );
const arr = [1,2,3],
transducer = compose( /* called transducer or xform */
map( add1 ), // 2,3,4
filter( even ), // 2,4
);
console.log( transducer(arr) ) // 2,4
console.log( transduce(transducer, addReducer, arr) ) // 6
【问题讨论】:
-
compose是错误的。当你通过compose(a, b)时,它会变成b(a(initVal)),而它应该以相反的顺序应用a(b(initVal)) -
谢谢您的回答。我明白了。 compose() 是右结合的,而 pipe() 是左结合的,对吧?
-
是的,你实现了
pipe。
标签: javascript clojure functional-programming