2013-12-14 3 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 будет списком списков, а не списком, head которого является числом. Что относительно системы вывода типа Haskell дает это ожидание и как я могу изменить код для последовательной реализации матричного умножения? ошибки времени

+0

Не закончили просматривать, но вы уверены, что хотите, чтобы ваш базовый регистр был '[[]]' (ровно один пустой список внутри списка)? –

+0

Я слишком устал, чтобы исправить проблемы, связанные с algorthmic, но проблемы типа возникают из-за использования '+' в строке 4 вместо ':' – jozefg

ответ

1

компиляция будет легко исправить, но я думаю, что вы могли бы иметь больший вопрос здесь ....

Подпись выражение неправильно. Я думаю, что вы пытаетесь умножить матрицу NXM на вектор длины N, IE-

| 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" 

(проверяет длину выполнения беспокойте меня .... Вы могли бы изготовить что-то, что движется некоторые проверки типов время компиляции путем определения «данных Matrix = Матрица [Вектор]», но я просто Кеп t с массивами здесь).

Смежные вопросы