我刚开始和Clojure一起玩。
如何遍历项目向量?
我天真的递归函数会有一个类似于经典地图的形式。
(defn map [f xs] (
(if (= xs [])
[]
(cons (f (first xs)) (map f (rest xs))
)
))问题是,我在网上找不到这类代码的任何例子。我发现了很多使用内置序列遍历函数的例子,比如for、map和循环。但是没有人做原始的递归版本。
那是因为你不应该在Clojure做这种事吗?(例如,因为它使用的是低级的Java原语,没有尾叫优化之类的?)?
发布于 2014-04-17 05:12:45
当你说“遍历一个向量”时,这是相当模糊的;因为Clojure是一个lisp,因此专门用于序列分析和操作,使用这种语言的好处是你不认为“遍历一个向量,然后用每个元素做一些事情”,相反,你会更贴切地说“从一个向量中提取它”,或者“将这个向量转换成X”,或者“我希望这个向量给我X”。
正是因为lisp语言中的这种透视图,你才会看到这么多的例子和产生的代码,它们不只是通过向量循环/重复,而是特别地以一种简短的、惯用的方式来追求所需要的东西。使用诸如reduce、map、filter、for、into等简单函数,您可以优雅地在向量等序列上移动,同时对内容进行所需的操作。在大多数其他语言中,这至少是两个不同的部分:循环,然后是实际的逻辑来做你想做的事情。
您经常会发现,如果您使用C、C++、Java等语言中的命令性更强的思想来考虑序列,那么您的代码大约要长4倍(至少),如果您首先以更实用的方式考虑您的计划的话。
https://stackoverflow.com/questions/23122612
复制相似问题