Questão 4: O traço de uma matriz é definido como sendo o somatório dos elementos de sua diagonal principal. Escreva uma função em Haskell que receba uma matriz quadrada (representada como lista de listas) e retorne seu traço.

Passo 1

O enunciado pede uma função em Haskell que, dado uma matriz quadrada (lista de listas), calcule o traço, ou seja, a soma dos elementos da diagonal principal. Vamos precisar de funções de manipulação de listas (zipWith, (!!)) e da função sum para agregar os valores.

Passo 2

Para pegar os elementos da diagonal, note que na linha de índice i (começando em 0) queremos o elemento de índice i. Podemos emparelhar cada linha com seu índice usando zip: zip m [0…].
Usando zipWith, conseguimos aplicar (!!) em paralelo na lista de linhas e na lista de índices. A expressão zipWith (!!) m [0…] retorna a lista dos elementos da diagonal.

Passo 3

Por fim, basta somar esses elementos com sum. A função completa fica simples e elegante em Haskell aproveitando composição de funções.
Explicação adicional: (!!) é o operador de índice em listas, zipWith f xs ys aplica f a pares de xs e ys até um deles acabar, e sum soma todos os elementos de uma lista numérica.

Resposta

matrixTrace :: Num a => [[a]] -> a
matrixTrace m = sum $ zipWith (!!) m [0…]

Exercícios relacionados