Hola.
Bueno, al final conseguí sacarlo, pero a falta de tiempo por exámenes y como nadie me lo pidió decidí esperar a que acabaran los exámenes. He echo algo así:
Código:
type Fila = [Float]
type Matriz = [Fila]
esDiagonal :: Matriz -> Bool
esDiagonal zss= (all (/=0) xss) && (all(==0) yss)
where
xss = noDiagonal zss
yss = diagonal zss
diagonal :: Matriz -> Fila
diagonal xss
|esCuadrada xss = (map p (lista xss))
|otherwise = error"matriz no cuadrada"
where
lista xss = zip [0..] xss
p (x, xs) = xs!!x
noDiagonal :: Matriz -> Fila
noDiagonal xss
|esCuadrada xss = concat(map p (lista xss))
|otherwise = error"matriz no cuadrada"
where
lista xss = zip [0..] xss
p (x, xs) = delete x xs
esCuadrada :: Matriz -> Bool
esCuadrada xss = all(\ xs -> length xs==d) xss
where
d=length xss
delete 0 (z:zs) = zs
delete x (z:zs) = z:(delete (x-1) zs)
Sé que es un tocho bueno, pero la idea está en 3 lineas
Saludos.