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

gre*_*emo 2 haskell list 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])
Run Code Online (Sandbox Code Playgroud)

执行:

*Main> transpose test_matrix3
[[1,2,4],[0,-3,5],[0,0,6],[*** Exception: Prelude.head: empty list
Run Code Online (Sandbox Code Playgroud)

luq*_*qui 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 [[],[],[]]
Run Code Online (Sandbox Code Playgroud)

这就是它发生的地方.这与第一个模式不匹配,因为它不是单个列表 - 它是一个包含三个元素的列表.所以:

= [1,2,3] : [0,-3,5] : [0,0,0] : map head [[],[],[]] : transpose (map tail [[],[],[]])
Run Code Online (Sandbox Code Playgroud)

这将为每个空列表提供一个错误,因为在空列表中既没有head也没有tail定义.