Questão 6 (DESAFIO): Escreva uma função em Haskell que receba duas matrizes (representadas como lista de listas) e retorne o resultado da multiplicação matricial das mesmas.

Passo 1

O enunciado pede pra criar uma função em Haskell que receba duas matrizes (listas de listas) e devolva a matriz produto delas. O conteúdo aqui é multiplicação matricial e vamos precisar entender dot product (produto escalar) de vetores e também como transpor uma matriz.

Passo 2

Antes de tudo, a multiplicação matricial faz com que cada elemento da matriz resultado seja o produto escalar entre uma linha da primeira matriz e uma coluna da segunda. Em Haskell a gente implementa isso com zipWith (*) para multiplicar termo a termo e sum para somar tudo.

Passo 3

Precisamos então de uma função auxiliar transpose que transforme linhas em colunas. Uma definição padrão é:
Implementamos dotProduct para receber dois vetores e devolver a soma dos produtos correspondentes. Em Haskell isso vira zipWith (*) seguido de sum.

Passo 4

Com transpose e dotProduct prontos, construímos matrixMultiply usando list comprehension: para cada linha em m e para cada coluna em n transposta, calculamos dotProduct.

Passo 5

Por fim, juntamos tudo, dando assinaturas de tipo genéricas para qualquer Num e retornamos o resultado da multiplicação.

Resposta

– Transpõe uma matriz
transpose :: [[a]] -> [[a]]
transpose ([]:_) = []
transpose x = map head x : transpose (map tail x)
– Produto escalar de dois vetores
dotProduct :: Num a => [a] -> [a] -> a
dotProduct v1 v2 = sum (zipWith (*) v1 v2)
– Multiplicação matricial
matrixMultiply :: Num a => [[a]] -> [[a]] -> [[a]]
matrixMultiply m n =
let colsN = transpose n
in [ [ dotProduct row col | col <- colsN ] | row <- m ]

Exercícios relacionados