You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 10:05:36