如何在Clojure中实现类似Haskell的unzip函数?
实现Clojure的unzip函数
我们需要实现一个unzip函数,它接收包含m个元素的序列(每个元素是拥有n个元素的集合),返回n个集合,每个集合包含对应位置的m个元素。示例如下:
(def pairs [[1 2] [3 4] [5 6]]) (unzip pairs) ; => [[1 3 5] [2 4 6]]
核心实现方案
利用Clojure原生的apply和map组合就能轻松实现支持任意元素数量的版本:
(defn unzip [coll] (mapv vec (apply map list coll)))
代码说明
apply map list coll:将输入序列中的每个子序列作为map的参数,list会把所有子序列对应位置的元素收集成一个列表mapv vec:把每个生成的列表转换为向量,最终返回向量组成的序列
测试验证
测试多元素场景:
; 每个子序列含3个元素的情况 (unzip [[1 2 3] [4 5 6] [7 8 9]]) ; => [[1 4 7] [2 5 8] [3 6 9]] ; 子序列数量为2的情况 (unzip [[10 20] [30 40]]) ; => [[10 30] [20 40]]
如果不需要返回向量,只需返回列表序列,可以简化实现:
(defn unzip [coll] (apply map list coll))
调用后会得到((1 3 5) (2 4 6))这样的结果。
内容的提问来源于stack exchange,提问作者sumek
相关产品推荐
相关产品推荐

