/ / ¿Por qué recibo "Exception: Prelude.head: lista vacía"? - lista, haskell, matriz, coincidencia de patrones

¿Por qué me aparece "Exception: Prelude.head: empty list"? - lista, haskell, matriz, coincidencia de patrones

¡No puedo averiguar por qué la combinación de patrones no está funcionando! Estoy empezando con Hasklell, ¡así que se paciente!

-- matrix implemented as a list of lists (rows of the matrix)
test_matrix3 = [[1,0,0],[2,-3,0],[4,5,6]]

-- transpose of a given matrix
transpose    (x:[]) = [x]
transpose all@(x:_) = map head all : transpose ([tail y | y <- all])

Ejecutando:

*Main> transpose test_matrix3
[[1,2,4],[0,-3,5],[0,0,6],[*** Exception: Prelude.head: empty list

Respuestas

2 para la respuesta № 1

Este me funcionó:

transpose" ([]:_) = []
transpose" xs = (map head xs) : (transpose" (map tail xs))

Prueba:

*Main> transpose" test_matrix3
[[1,2,4],[0,-3,5],[0,0,6]]

6 para la respuesta № 2
  transpose [[1,0,0],[2,-3,0],[4,5,6]]
= [1,2,4] : transpose [[0,0],[-3,0],[5,6]]
= [1,2,4] : [0,-3,5] : transpose [[0],[0],[6]]
= [1,2,4] : [0,-3,5] : [0,0,0] : transpose [[],[],[]]

Y aquí es donde sucede. Esto no coincide con el primer patrón, porque no es una lista singleton, es una lista con tres elementos. Asi que:

= [1,2,3] : [0,-3,5] : [0,0,0] : map head [[],[],[]] : transpose (map tail [[],[],[]])

Lo que le dará un error por cada lista vacía, ya que ninguno head ni tail Se definen en listas vacias.


1 para la respuesta № 3

Considera que estás trabajando en una lista de listas. Por lo tanto, su primera coincidencia de patrón siempre falla en su matriz de prueba. Básicamente, sigues tomando la cola de cada elemento de tu lista, pero esto no reduce la cantidad de elementos en tu lista, solo reduce su tamaño individual.

Para corregir esto, es posible que desee modificar su primer patrón para que coincida con la estructura de x.

¡Recuerda, lista de listas!