2013-12-14 30 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与阵列在这里)。