Clojure集合操作与抽象:深入解析及应用
1. 惰性序列与副作用
在定义惰性序列时,应尽量减少副作用。因为惰性序列的值是在被访问时才被计算,而非定义时,所以很难跟踪与这些值产生相关的副作用何时何地发生。例如,在消费惰性序列时更改日志级别,可能会突然允许日志事件通过,即使在定义惰性序列时日志级别被设置为抑制此类消息。
部分惰性序列的计算可能会被批量处理以优化性能,这会使元素的实现超前于消费,导致副作用成批出现,而非与每个值的消费同步。因此,通常不应依赖序列的计算来控制执行流程。在Clojure中,惰性仅适用于序列,语言的其他部分和数据结构都是“急切”求值的。惰性序列使Clojure能够透明地处理无法全部放入内存的大数据集,并以更统一、声明式和流水线式的方式表达算法。
以下是一个简单的示例,展示了如何从数据源提取序列、处理它,然后将其转换回更合适的数据结构:
(apply str (remove (set "aeiouy")
"vowels are useless! or maybe not..."))
;= "vwls r slss! r mb nt..."
在这个例子中,字符串 "vowels are useless! or maybe not..." 被隐式转换为字符序列,所有元音被移除,然后结果序列被聚合回字符串。
1.1 头部保留问题
Clojure新手常忽略的一个事实是,惰性序列是持久的:一个元素只计算一次,但仍被序列保留。只要保留对序列的引用,就会
超级会员免费看
订阅专栏 解锁全文
29

被折叠的 条评论
为什么被折叠?



