All*_*ate 4 list-comprehension clojure for-comprehension
我正在阅读Programming Clojure第2版,在第49页上它涵盖了Clojure的for循环结构,它说它实际上是一个序列理解.
作者建议使用以下代码:
(defn indexed [coll] (map-indexed vector coll))
(defn index-filter [pred col]
(when pred
(for [[idx elt] (indexed col) :when (pred elt)] idx)))
(index-filter #{\a} "aba")
(0 2)
Run Code Online (Sandbox Code Playgroud)
...优于基于Java的命令式示例,并且给出的证据是"通过使用高阶函数......任何函数索引都避免了对变量的所有需求".
什么是"idx","elt",如果它们不是变量?它们是指除累加器之外的变量吗?
另外,为什么#{\ a}而不是"a"?
pred是一个函数 - #{\a}是一个包含字符a的集合.在Clojure中,set是一个函数,如果它的参数\a包含它,则返回true .你也可以使用#(= % \a)或(fn [x] (= \a x)).
正如另一个答案所暗示的那样,"在制作这个例子时没有创造任何国家." idx并且elt函数类似于变量,但是只对for序列理解是局部的,所以代码更紧凑,不是有状态的,并且可以说更清晰(一旦你用来排序理解,至少:-)) - 也许文本不是在这一点上最佳清晰.
| 归档时间: |
|
| 查看次数: |
211 次 |
| 最近记录: |