2013-12-14 58 views
0

我的矩陣乘法實現:更改不希望的類型推斷在Haskell

mtrxMult :: (Num a) => [[a]] -> [a] -> [a] -> [a] 
mtrxMult [[]] _ _ = [] 
mtrxMult xs [] vec = 0 : mtrxMult xs vec vec 
mtrxMult (x:xs) (v:vs) vec = head x * v + mtrxMult (tail x : xs) vs vec 

的想法是,函數調用mtrxMult [[0,1],[1,0]] [2,3] [2,3]將擴大到0 * 2 + 1 * 3 : 2 * 1 + 3 * 0 : []將評估爲[3,2]。然而,編譯器希望x是列表的列表,而不是頭部是數字的列表。 Haskell的類型推斷系統如何給出這種期望以及如何修改代碼以實現矩陣乘法的一致性?

+0

還未完成查看,但是您確定要基本案例爲[[]]'(列表中只有一個空列表)嗎? –

+0

我太累了,無法解決algorthmic問題,但類型問題來自使用'+'在第4行而不是':' – jozefg

回答

1

編譯時錯誤很容易解決,但我認爲你可能在這裏有一個更大的問題....

表達的簽名是錯誤的。我想你想乘長度爲N的向量N×M矩陣,即 -

| a b | | x | | ax + by | 
| c d | X | y | = | cx + dy | 
| e f |   | ex + fy | 

如果我是正確的,該函數的簽名應該是

mtrxMult::Num a=>[[a]]->[a]->[a] 

和實施將

dotMult::Num a=>[a]->[a]->a 
dotMult x y | length x == length y = sum $ zipWith (*) x y 
dotMult x y = error "Vectors should be of same length in call to dotMult" 

mtrxMult::Num a=>[[a]]->[a]->[a] 
mtrxMult m x | length x == length m = map (dotMult x) y 
mtrxMult _ _ = error "Matrix width must be vector length" 

(運行長度檢查打擾我....你也許可以手藝的東西,將一些類型檢查的定義「數據矩陣=矩陣向量]」,但我只是KEP編譯時間t與陣列在這裏)。