Я новичок в 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
В чем проблема:
В моей сигнатуре типа указано, что вторым параметром для пересечения является список списков. Поэтому, когда я pattern сопоставлен с "s (x: y: xs)", x и y стали списками. И все же я рассматривал x и y как элементы, а не списки.
Руководство по устранению ошибки "бесконечного типа" :
В большинстве случаев, когда вы получаете эту ошибку, вы забыли типы различных переменных, с которыми имеете дело, и вы попытались использовать переменную, как если бы это был какой-то другой тип, чем тот, который есть. Посмотрите внимательно на то, что тип все по сравнению с тем, как вы его используете, и это обычно обнаруживает проблему.