Ich habe den oben gesehenen Code in Haskell geschrieben. Wenn ich dies mit irgendeinem anderen Parameter ausführe, zum Beispiel
%Vor%Es gibt
%Vor%respektive.
Es schlägt fehl, wenn ich es mit einer leeren Liste ausführe.
%Vor%Fehlermeldung
%Vor%Fragen
NestedList
-Definition ändern, um eine leere List
zu akzeptieren? Wenn ja, wie mache ich das? Es ist ziemlich verwirrend. Das Problem ist, dass der Compiler den Typ von flatten $ List []
nicht kennt. Versuchen Sie, den Typ selbst herauszufinden, Sie sehen [a]
für einige a
, während print
verlangt, dass sein Argument eine Instanz von Show
ist, und [a]
ist eine Instanz von Show
if a
ist eine Instanz von Show
. Obwohl Ihre Liste leer ist, so dass keine Einschränkung für a
erforderlich ist, um []
darzustellen, gibt es keine Möglichkeit für den Compiler zu wissen.
Daher sollte eine explizite Typ-Annotation (für jeden Typ, für den eine Instanz von Show
existiert) verwendet werden:
oder
%Vor%oder
%Vor% Der Listentyp ist polymorph. Da Sie kein Element angeben, nur den leeren Listenkonstruktor []
, können Sie nicht ableiten, um welchen Listentyp es sich handelt.
Ist es: [] :: [Int]
oder [] :: [Maybe (Either String Double)]
. Wer soll es sagen?
Sie sind. Geben Sie eine Typannotation ein, um den Polymorphismus aufzulösen, und GHC kann dann zur korrekten show-Instanz senden.
z.
%Vor%Um den Antworten hier bereits hinzuzufügen, können Sie einwenden, "aber was ist es wichtig, welche Art von Dingen meine Liste enthält? Es enthält keine davon!"
Zunächst einmal ist es einfach, Situationen zu konstruieren, in denen unklar ist, ob die Liste leer ist oder nicht, und die Typüberprüfung hasst es trotzdem, Werte zu betrachten, sie will nur sehen Typen . Dies hält die Dinge einfacher, weil es bedeutet, dass Sie im Umgang mit Werten sicher sein können, dass Sie bereits alle Typen kennen.
Zweitens ist es eigentlich wichtig , welche Art von Liste es ist, auch wenn es leer ist:
%Vor%Tags und Links haskell