Soy nuevo en Haskell y estoy frente a un error de "no se puede construir el tipo infinito" que no puedo entender.¿Por qué este código Haskell produce el error de "tipo infinito"?
De hecho, más allá de eso, no he podido encontrar una buena explicación de lo que este error significa, así que si pudieras ir más allá de mi pregunta básica y explicar el error del "tipo infinito", realmente apreciaría eso.
Aquí está el código:
intersperse :: a -> [[a]] -> [a]
-- intersperse '*' ["foo","bar","baz","quux"]
-- should produce the following:
-- "foo*bar*baz*quux"
-- intersperse -99 [ [1,2,3],[4,5,6],[7,8,9]]
-- should produce the following:
-- [1,2,3,-99,4,5,6,-99,7,8,9]
intersperse _ [] = []
intersperse _ [x] = x
intersperse s (x:y:xs) = x:s:y:intersperse s xs
Y aquí está el error de tratar de cargarlo en el intérprete:
Prelude> :load ./chapter.3.ending.real.world.haskell.exercises.hs
[1 of 1] Compiling Main (chapter.3.ending.real.world.haskell.exercises.hs, interpreted)
chapter.3.ending.real.world.haskell.exercises.hs:147:0:
Occurs check: cannot construct the infinite type: a = [a]
When generalising the type(s) for `intersperse'
Failed, modules loaded: none.
Gracias.
-
Aquí es un poco de corregir el código y una guía general para tratar con el error "infinita" en Haskell:
código corregido
intersperse _ [] = []
intersperse _ [x] = x
intersperse s (x:xs) = x ++ s:intersperse s xs
Lo que el el problema era:
Mi estado de firma de tipo s que el segundo parámetro para intercalar es una lista de de listas. Por lo tanto, cuando el patrón coincide con "s (x: y: xs)", xey se convirtieron en listas. Y sin embargo, estaba tratando x e y como elementos, no como listas.
Guía para hacer frente a la "infinita de tipo" error:
mayoría de las veces, cuando recibe este error, se han olvidado de los tipos de las diversas variables que está tratando, y usted han intentado usar una variable como si fuera de algún otro tipo de lo que es. Mire cuidadosamente qué tipo es todo versus cómo lo está usando, y esto generalmente descubrirá el problema.
Otro buen consejo: declare los tipos explícitamente. Esto le da algo al compilador para contrastar. –
Así que esto resuelve el problema, pero ¿por qué el compilador dice "No se puede construir el tipo infinito?". Qué significa eso? Si el problema es que está tratando de realizar operaciones en tipos que no son compatibles con esas operaciones, ¿por qué el compilador no dice algo así? – freedrull
+1 para la estructura de la pregunta (pregunta - corregida - el problema fue - guía) – Dacav