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]]的过程:
- 第一次调用:
map head p得到[1,3],递归调用myTranspose (map tail p),也就是myTranspose [[2], [4]] - 第二次调用:
map head p得到[2,4],递归调用myTranspose (map tail p),也就是myTranspose [[], []] - 第三次调用:触发
([]:_)模式,返回[] - 最终结果拼接为
[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
相关产品推荐
相关产品推荐

