gpt4 book ai didi

clojure - doseq 应该给我副作用,那为什么它只适用于 dorun?

转载 作者:行者123 更新时间:2023-12-04 02:16:26 24 4
gpt4 key购买 nike

我写了一个简单的程序,它接受一个数字 n 和一个列表作为输入。然后将列表中的每个元素打印 n 次。

我最初尝试过这个

(defn list-repl [num lst]
(doseq [elem lst]
(map println (repeat num elem))))

这没有用。无输出。然后在查看文档时我发现了 dorun。我试过了,它确实有效。

(defn list-repl [num lst]
(doseq [elem lst]
(dorun (map println (repeat num elem)))))

阅读文档我能理解的是 doseq就像一个循环结构,它会在其 body 表达中产生副作用。 dorun也直接对序列执行此操作。

这个理解对吗?如果它是正确的,那么第一个例子中的正文应该给我打印数字的副作用。但那并没有发生。那么我的理解中缺少什么?

最佳答案

基本上,doseq 无法在其体内强制产生所有副作用。为了保证它必须递归地检查其主体中的每个表达式以强制进行惰性子计算,这将是……具有挑战性的。它只处理顶级表达式。强制执行任何惰性子计算是表达式作者的工作。

如果您需要多层循环来“解包”外部序列的成员,请记住 doseqfor 和其他变体都通过提供超过一个绑定(bind):

(defn list-repl [num lst]
(doseq [elem lst
to-print (repeat num elem)]
(println to-print)))

关于clojure - doseq 应该给我副作用,那为什么它只适用于 dorun?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33463900/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com