Я новичок в 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 как элементы, а не списки.
Руководство по устранению ошибки «бесконечного типа»:
В большинстве случаев, когда вы получаете эту ошибку, вы забываете типы различных переменных, с которыми имеете дело, и пытались использовать переменную так, как если бы это был какой-то другой тип, а не какой является. Посмотрите внимательно, какой тип все по сравнению с тем, как вы его используете, и это, как правило, поможет решить проблему.