【问题标题】:Clojure - Map through all levelsClojure - 映射所有级别
【发布时间】:2012-12-13 09:33:55
【问题描述】:

我正在尝试创建一个遍历每个元素并应用操作的映射函数。它很像map 函数,但更深入。

该函数有两个参数;一个函数,一个用于参数。

这是我目前所拥有的:

(defn go-through
 [op & args]
   (if-not (sequential? (first args))
     (apply op args)
     (apply (partial map go-through op) args)))

而且我知道最后一行是行不通的,即使不调用它。但我不知道还有什么办法。

建议?


也许我限制了这种功能的用途。

示例:

user=> (go-through + 1 2)
3
user=> (go-through + [1 2] [3 4])
IllegalArgumentException Don't know how to create ISeq from: clojure.core$_PLUS_     clojure.lang.RT.seqFrom (RT.java:494)

我期待[4 6]

这个想法适用于任何对单个元素而不是顺序操作的函数。

【问题讨论】:

  • 您能否包含一个示例输入和输出?它应该保留树结构还是生成序列?
  • @ArthurUlfeldt,它应该保留树结构。
  • 你想要[4 6]还是[3 7]?
  • 我想要[4 6]。它将函数映射到两个向量。我不是在寻找reduce

标签: clojure


【解决方案1】:

这可能是你的解决方案:

(defn go-through [op & args]
   (if-not (sequential? (first args))
     (apply op args)
     (apply map op args)))

(go-through + 1 2 3)
-> 6

(go-through + [1 2] [3 4] [5 6])
-> (9 12)

版本 2(固定原始示例)

(defn go-through [op & args]
   (if-not (sequential? (first args))
     (apply op args)
     (apply map (partial go-through op) args)))

(go-through + [[1 2] [3 4]] [[5 6] [7 8]])
-> ((6 8) (10 12))

【讨论】:

  • @Zchpyvr 有一个错误。我刚刚修好了。
  • 抱歉,实际上,这个解决方案在深度为 2 时不起作用。
  • @Zchpyvr 你能举个例子吗?无论如何,我已经添加了另一个版本。
【解决方案2】:

请注意,您的第一行都不起作用,因为“if”条件只是检查第一个参数是否是顺序的,然后调用 op 将所有参数。

我建议使用http://richhickey.github.com/clojure/clojure.walk-api.html 或查看其代码;)

【讨论】:

  • ....出于某种原因,我使用它的方式,第一行有效,它只是“其他”。请看上面的输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2018-03-15
  • 2015-08-02
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多