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

Haskell中([]:_)语法含义是什么?附矩阵转置函数代码

理解Haskell中的([]:_) 模式匹配

嘿,这个([]:_) 是Haskell里模式匹配的写法,我来给你拆解开讲清楚:

首先先回忆下Haskell里列表的基本规则:

  • : 是列表的「构造运算符」(也叫cons运算符),作用是把单个元素放到列表的头部,比如 1:[2,3] 等价于 [1,2,3]
  • _ 是通配符,代表「匹配任意值,且不需要将其绑定到变量」

结合你的代码上下文,Mat a 被定义为 [[a]](也就是二维列表,用来表示矩阵),所以([]:_) 这个模式匹配的是**「第一行是空列表」的矩阵**,比如:

  • []:[[1,2], [3,4]](第一行是空,后面跟着非空行)
  • []:[](只有一行空列表的矩阵)

再看你的myTranspose函数,这个模式是递归的终止条件:
当你递归转置矩阵时,每次都会取每一行的head组成新行,然后递归处理每一行的tail(去掉首元素后的剩余部分)。直到某一次递归时,传入的矩阵第一行变成了空列表——这说明所有行都已经没有元素可以转置了,此时直接返回[],结束递归流程。

举个实际的例子,转置[[1,2], [3,4]]的过程:

  1. 第一次调用:map head p得到[1,3],递归调用myTranspose (map tail p),也就是myTranspose [[2], [4]]
  2. 第二次调用:map head p得到[2,4],递归调用myTranspose (map tail p),也就是myTranspose [[], []]
  3. 第三次调用:触发([]:_) 模式,返回[]
  4. 最终结果拼接为 [1,3] : ([2,4] : []),也就是[[1,3], [2,4]],完全符合矩阵转置的预期。

你的完整代码可以这样格式化查看:

type Mat a = [[a]]
myTranspose :: Mat a -> Mat a
myTranspose ([]:_) = []
myTranspose p = (map head p) : myTranspose (map tail p)

内容的提问来源于stack exchange,提问作者Joao Parente

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:03:56