Я новичок в 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
Какого проблема была:
Мой тип подпись состояние s, что вторым параметром для интерполяции является список списков. Поэтому, когда я сопоставлялся с «s (x: y: xs)», x и y становились списками. И все же я рассматривал x и y как элементы, а не списки.
Руководства по работе с ошибкой «бесконечный типа»:
Большой частью времени, когда вы получите эту ошибку, вы забыли типы различных переменные, которые вы имеете дело с, и вы попытались использовать переменную, как если бы это был какой-то другой тип, чем тот, который есть. Посмотрите внимательно, что у вас есть, и как вы его используете, и это, как правило, выявляет проблему.
Еще один хороший совет: явным образом объявляю типы. Это дает компилятору что-то, что нужно проверить. –
Итак, это решает проблему, но почему компилятор говорит: «Невозможно построить бесконечный тип?». Что это значит? Если проблема заключается в том, что вы пытаетесь выполнять операции над типами, которые не поддерживают эти операции, почему компилятор не говорит что-то подобное? – freedrull
+1 для структуры вопроса (вопрос исправлен - проблема была - ориентир) – Dacav