Ich bin neu in Haskell und habe den Fehler "Ich kann keinen unendlichen Typ konstruieren", den ich nicht verstehen kann.
Darüber hinaus konnte ich keine gute Erklärung dafür finden, was dieser Fehler überhaupt bedeutet. Wenn Sie also über meine grundlegende Frage hinausgehen und den Fehler "Unendlicher Typ" erklären könnten, würde ich ihn wirklich begrüßen.
Hier ist der Code:
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
Und hier ist der Fehler beim Versuch, ihn in den Interpreter zu laden:
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.
Vielen Dank.
- -
Hier einige korrigierte den Code und eine allgemeine Richtlinie für den Umgang mit dem Fehler "Unendlicher Typ" in Haskell:
Code korrigiert
intersperse _ [] = []
intersperse _ [x] = x
intersperse s (x:xs) = x ++ s:intersperse s xs
Was war das Problem:
Meine Typensignatur besagt, dass der zweite Parameter, der eingestreut werden soll, eine Liste von Listen ist . Wenn ich ein Muster mit "s (x: y: xs)" übereinstimmte, wurden x und y daher zu Listen . Und doch behandelte ich x und y als Elemente, nicht als Listen.
Richtlinie für den Umgang mit dem Fehler "Unendlicher Typ":
Wenn Sie diesen Fehler erhalten, haben Sie meistens die Typen der verschiedenen Variablen vergessen, mit denen Sie sich befassen, und Sie haben versucht, eine Variable so zu verwenden, als wäre sie ein anderer Typ als der, der sie ist. Schauen Sie sich genau an, um welchen Typ es sich handelt und wie Sie ihn verwenden. Dadurch wird das Problem normalerweise aufgedeckt.