Почему этот код на Haskell вызывает ошибку «бесконечного типа»?

Я новичок в Haskell и сталкиваюсь с ошибкой «не могу создать бесконечный тип», которую не могу понять.

На самом деле, помимо этого, я не смог найти хорошего объяснения того, что вообще означает эта ошибка, поэтому, если бы вы могли выйти за рамки моего основного вопроса и объяснить ошибку «бесконечного типа», я был бы очень признателен.

Вот код:

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

И вот ошибка при попытке загрузить его в интерпретатор:

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.

Благодарю.

-

Вот некоторые исправленные код и общие рекомендации по устранению ошибки «бесконечного типа» в Haskell:

Исправленный код

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

В чем проблема была:

Моя сигнатура типа гласит, что вторым параметром intersperse являетсясписок списков, Поэтому, когда я сопоставил шаблон с "s (x: y: xs)", x и y сталисписки, И все же я рассматривал x и y как элементы, а не списки.

Руководство по устранению ошибки «бесконечного типа»:

В большинстве случаев, когда вы получаете эту ошибку, вы забываете типы различных переменных, с которыми имеете дело, и пытались использовать переменную, как если бы это был какой-то другой тип, отличный от того, чем он является. Посмотрите внимательно, какой тип все по сравнению с тем, как вы его используете, и это, как правило, поможет решить проблему.

Ответы на вопрос(4)

Ваш ответ на вопрос