Questão 1: Escreva uma função em Haskell que receba uma matriz (representada como lista de listas) e retorne sua respectiva matriz transposta.
Passo 1
Vamos criar uma função em Haskell que receba uma matriz (lista de listas) e devolva a matriz transposta — ou seja, transforme linhas em colunas. Para isso, precisamos entender que a primeira coluna da matriz original vira a primeira linha da nova, a segunda coluna vira a segunda linha e assim por diante.
Passo 2
O truque é usar recursão. A cada passo, extraímos a cabeça de cada lista (row) para formar a primeira linha da transposta, usando
map head
. Depois, preparamos o restante da matriz original sem esses primeiros elementos, usando map tail
, e aplicamos a transposição de novo.Passo 3
Precisamos tratar casos-base: se a matriz é vazia (
[]
), não há nada a transpor. Se a matriz não é vazia mas sua primeira linha é vazia ([]: _
), significa que todas as linhas já foram “consumidas” e não há mais colunas a transpor — retornamos []
.Passo 4
Com isso definido, escrevemos a assinatura de tipo e os padrões de correspondência, juntando tudo na função
transpose
. A implementação final aproveita map head
e map tail
e faz a chamada recursiva.Resposta
transpose :: [[a]] -> [[a]]
transpose [] = []
transpose ([]:_) = []
transpose x = map head x : transpose (map tail x)
transpose [] = []
transpose ([]:_) = []
transpose x = map head x : transpose (map tail x)