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

Haskell中transpose [[]]为何等于[]?探究base库设计缘由

Haskell中transpose对嵌套空列表的特殊行为解析

先看transpose在base库中的核心实现逻辑(简化版):

transpose :: [[a]] -> [[a]]
transpose []             = []
transpose ([]   : xss)   = transpose xss  -- 跳过空行,继续处理剩余行
transpose ((x:xs) : xss) = (x : map head xss) : transpose (xs : map tail xss)

逐个案例拆解原因

  • transpose []:输入是空的行集合,没有行自然也没有列,返回空列表符合逻辑。
  • transpose [[]]:输入是仅包含一个空行的集合。根据实现的第二个模式,会跳过这个空行,递归处理剩余的空行集合([]),最终返回[]。从语义上看,这个输入代表一个“1行0列”的矩阵,不存在任何列,转置后自然没有行。
  • transpose [[[]]]及更深嵌套的情况:以[[[]]]为例,输入是包含一个非空行的集合,该行的元素是空列表。此时匹配第三个模式:
    1. 提取该行的首元素([]),结合剩余行(空集合)的首元素(空),组成第一列[[]];
    2. 递归处理该行去掉首元素后的剩余部分(空行)加剩余行的尾部分(空集合),即调用transpose [[]]得到[];
    3. 最终将第一列与递归结果拼接,得到[[[]]]。
      这类输入本质是“1行1列”的矩阵,即使矩阵中的元素是空列表,转置后依然保持1行1列的结构,因此结果与输入一致。

设计的合理性

transpose的语义是将行集合转换为列集合,核心关注的是是否存在有效列:

  • 当所有行都没有元素(或只有空行),则不存在有效列,返回空;
  • 只要存在至少一个行有元素(哪怕元素本身是空列表),就会生成对应的列,保持结构一致性。

这种设计并非“不优雅”,而是严格遵循了列表转置的语义:转置操作的对象是“行的集合”,行中的元素可以是任意类型(包括空列表),但行本身是否为空决定了是否能贡献列元素。

内容的提问来源于stack exchange,提问作者Brendan Langfield

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:26:10