无法弄清楚为什么模式匹配不起作用!我是从Hasklell开始的,所以请耐心等待!
-- matrix implemented as a list of lists (rows of the matrix)
test_matrix3 = [[1,0,0],[2,-3,0],[4,5,6]]
-- transpose of a given matrix
transpose (x:[]) = [x]
transpose all@(x:_) = map head all : transpose ([tail y | y <- all])
执行:
*Main> transpose test_matrix3
[[1,2,4],[0,-3,5],[0,0,6],[*** Exception: Prelude.head: empty list
答案 0 :(得分:6)
transpose [[1,0,0],[2,-3,0],[4,5,6]]
= [1,2,4] : transpose [[0,0],[-3,0],[5,6]]
= [1,2,4] : [0,-3,5] : transpose [[0],[0],[6]]
= [1,2,4] : [0,-3,5] : [0,0,0] : transpose [[],[],[]]
这就是它发生的地方。这与第一个模式不匹配,因为它不是单个列表 - 它是一个包含三个元素的列表。所以:
= [1,2,3] : [0,-3,5] : [0,0,0] : map head [[],[],[]] : transpose (map tail [[],[],[]])
每个空列表会出现一个错误,因为在空列表中都没有定义head
和tail
。
答案 1 :(得分:2)
这个对我有用:
transpose' ([]:_) = []
transpose' xs = (map head xs) : (transpose' (map tail xs))
测试:
*Main> transpose' test_matrix3
[[1,2,4],[0,-3,5],[0,0,6]]
答案 2 :(得分:1)
请考虑您正在处理列表清单。因此,您的第一个模式匹配始终在测试矩阵上失败。基本上你一直在剔除列表中每个元素的尾部,但这不会减少列表中元素的数量,只会减少它们的个体大小。
要更正此问题,您可能需要修改第一个模式以匹配x
的结构。
请记住,列表清单!