6

在这篇博文“JavaScript 中的 CSP 和转换器”中,作者指出:

首先,我们必须意识到许多数组(或其他集合)操作,如map,filter并且reverse可以用 a 来定义reduce

因此,我们看到Clojure 中的一些实现并不是懒惰的,而是急切的:

 user> (defn eager-map [f coll]
        (reduce (fn [acc v] (conj acc (f v)))
        []
        coll))
#'user/eager-map
user> (eager-map inc (range 10))
[1 2 3 4 5 6 7 8 9 10]

我的问题是,Clojure 转换器是否渴望?

4

1 回答 1

16

转换器是非常简单的功能——它们没有惰性的概念,或者实际上根本没有它们的应用方式。这就是这个想法的美妙之处——使用传感器,我们可以将函数mapfilter它们所操作的事物分开。

所以,是的,它们可以用来构建惰性序列,以及通道和归约。虽然转换器函数调用本身是急切的,但这取决于您将转换器交给什么东西来调用它。惰性序列只能在它们被消耗时才可以惰性地调用转换器,而减速器将急切地使用它们来吐出减少。

您可以在源代码中看到sequence用于在带有传感器的集合上构建惰性序列的地方。

于 2014-09-04T02:29:09.547 回答