¿Por qué este código Haskell produce el error "tipo infinito"?

Soy nuevo en Haskell y me enfrento a un error de "no se puede construir un tipo infinito" que no puedo entender.

De hecho, más allá de eso, no he podido encontrar una buena explicación de lo que significa este error, por lo que si pudiera ir más allá de mi pregunta básica y explicar el error de "tipo infinito", realmente lo agradecería.

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 al intentar 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í hay algunos corregidos el código y una guía general para tratar el error de "tipo infinito" en Haskell:

Código corregido

intersperse _ [] = []
intersperse _ [x] = x
intersperse s (x:xs) =  x ++ s:intersperse s xs 

Cuál fue el problema:

Mi firma de tipo indica que el segundo parámetro a intercalar es unlista de listas. Por lo tanto, cuando el patrón coincide con "s (x: y: xs)", x e y se convierten enliz. Y, sin embargo, trataba a x e y como elementos, no como listas.

Guideline para tratar el error "tipo infinito":

La mayoría de las veces, cuando recibe este error, ha olvidado los tipos de las diversas variables con las que está tratando, y ha intentado usar una variable como si fuera un tipo diferente al que es. Mire cuidadosamente qué tipo es todo versus cómo lo está usando, y esto generalmente descubrirá el problema.

Respuestas a la pregunta(4)

Su respuesta a la pregunta