最近尝试在项目使用ramda 和 rxjs 相较于前段时间研究的clojure做了个对比
ramda的fp风格和clojure已经很接近了ramda支持函数默认柯里化调用、函数局部套用比clojure方便点
ramda里面没有clojure里面一个很重要的惰性序列,clojure中的惰性序列类似JavaScript中的生成器
clojure的惰性序列比JavaScript的生成器高级,因为clojure在接口层面把惰性序列和普通序列统一成了一个概念,比如一个函数接受一个序列作为参数,函数内部是不需要区分这个序列是惰性的还是非惰性的,JavaScript中的生成器很明显和其他对象具有不同的接口
rxjs对流应用操作符的过程非常像在clojure惰性序列的操作,不过rxjs对流的操作能力,相比于clojure 的惰性序列操作还是逊色很多,从本质上来说clojure的惰性序列是一个生成器,由消费者触发‘拉取’数据,而rxjs实际上是生产者主动 ‘推送’数据给消费者
在clojure中我们可以要求一个有限序列和一个无限惰性序列进行‘交织’操作,而在ramda中这是不被支持的,因为在JavaScript中有限序列和生成器是两个概念,rxjs中支持两个事件流的交织,不过这里的交织动作是由数据生产者触发的,而不是消费者
总结,在JavaScript中使用了ramda和 rxjs等工具库还是很难达到在clojure中顺畅的函数式编程体验