Keine Instanz für (Show a0) durch Verwendung von 'print' Die Typvariable 'a0' ist mehrdeutig

7
%Vor%

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

  1. Warum schlägt es fehl und wie kann ich das beheben?
  2. Soll ich meine NestedList -Definition ändern, um eine leere List zu akzeptieren? Wenn ja, wie mache ich das? Es ist ziemlich verwirrend.
thefourtheye 04.09.2013, 13:47
quelle

4 Antworten

7

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:

%Vor%

oder

%Vor%

oder

%Vor%     
Nicolas Trangez 04.09.2013, 13:56
quelle
15

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%     
Don Stewart 04.09.2013 13:55
quelle
8

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%     
Ben Millwood 04.09.2013 23:16
quelle
2

[] kann eine Liste von Floats, Strings, Booleans oder eigentlich jedem Typ sein. Daher weiß print nicht, welche Instanz von show verwendet werden soll.

Führen Sie die Fehlermeldung aus und geben Sie einen expliziten Typ an, wie in ([] :: [Int]) .

    
chirlu 04.09.2013 13:59
quelle

Tags und Links