【问题标题】:weirdness in clojure map functionclojure map 函数的奇怪之处
【发布时间】:2011-03-20 14:37:51
【问题描述】:

clojure 中关于 map 的第一个奇怪的地方在于以下 sn-p:

(apply map list '((1 a) (2 b) (3 c)))

结果令我惊讶:

((1 2 3) (a b c))

谁能解释一下它是如何工作的?

【问题讨论】:

  • 这是一个很好的问题并产生了一个非常有用的答案(如何转置 Clojure seq),但标题在帮助人们找到这个问题时并不是特别清楚。如果@Dfr 或其他人没问题,我有兴趣改进它。

标签: list clojure


【解决方案1】:

(apply f x '(y z)) 等价于(f x y z),所以你的代码就等价于(map list '(1 a) '(2 b) '(3 c))

当使用多个列表调用时,map 并行迭代列表并使用每个列表中的一个元素为每个元素调用给定函数(即,结果列表的第一个元素是使用第一个元素调用函数的结果)每个列表的元素作为其参数,第二个是第二个元素的结果等)。

所以(map list '(1 a) '(2 b) '(3 c)) 首先调用list,将列表的第一个元素(即数字)作为参数,然后使用第二个元素(字母)。所以你得到((list 1 2 3) (list 'a 'b 'c))

【讨论】:

  • 是的,我发现 map 压缩多个集合的能力非常有用。请注意,如果您知道要压缩多少个集合,则可以使用 %n 来引用第 n 个集合中的元素,例如(map #(myfun %1 (- %2 %3)) '(1 2) '(2 3) '(3 4))
猜你喜欢
  • 2012-05-08
  • 1970-01-01
  • 2021-08-18
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-01
  • 2016-12-27
相关资源
最近更新 更多