为什么我得到“例外:Prelude.head:空列表”?

时间:2011-02-03 06:47:37

标签: list haskell matrix pattern-matching

无法弄清楚为什么模式匹配不起作用!我是从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

3 个答案:

答案 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 [[],[],[]])

每个空列表会出现一个错误,因为在空列表中都没有定义headtail

答案 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的结构。

请记住,列表清单!