Я новачок у 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 (x: y: xs)", x та y ставали списками . І все-таки я поводився з x і y як з елементами, а не як списки.
Вказівки щодо усунення помилки "нескінченного типу":
Здебільшого, коли ви отримуєте цю помилку, ви забуваєте типи різних змінних, з якими ви стикаєтесь, і намагаєтеся використовувати змінну так, ніби це інший тип, ніж той, що вона є. Уважно подивіться, якого типу все в порівнянні з тим, як ви його використовуєте, і це, як правило, виявить проблему.