2011-02-03 57 views
2

無法弄清楚爲什麼模式匹配不起作用!我從Hasklell開始,所以要耐心等待!爲什麼我會得到「例外:Prelude.head:空列表」?

-- 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 [email protected](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 

回答

2

這一個爲我工作:

transpose' ([]:_) = [] 
transpose' xs = (map head xs) : (transpose' (map tail xs)) 

測試:

*Main> transpose' test_matrix3 
[[1,2,4],[0,-3,5],[0,0,6]] 
1

想想看,你是一個列表中,列出了工作。因此你的第一次模式匹配總是在你的測試矩陣上失敗。基本上你會繼續使用列表中每個元素的尾部,但這不會減少列表中元素的數量,它只會減少它們的個體大小。

要解決此問題,您可能需要修改第一個模式以匹配x的結構。

請記住,列表清單!

+0

當然我知道了。但我找不到一個學習某種「先進」模式匹配的好地方。我試過([]:_),它不起作用。另外([],_)只會匹配[[],[]] ... – gremo 2011-02-03 07:10:27

+0

@Gremo:`([],_)`是一個元組,因此只會匹配一個元組,它的第一個元素是一個空列表。例如,試着在42`中計算`let([],_)= [[],[]],你會得到一個編譯時錯誤,例如`let [[],_ ] = [66]中的[[],[]]。 – 2011-02-03 07:51:13

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是在空列表定義。

+0

很好的解釋,但我不明白爲什麼[[],[],[]]不匹配第一個。 – gremo 2011-02-03 07:11:13

相關問題