2016-11-20 1 views
1

Kontext: Ich bin weniger als eine Woche, um herauszufinden, Haskell aus, ich genieße mich bisher, aber dieser hier stampft mich. Dies scheint das einfachste Beispiel zu sein, das mein Problem demonstriert:Ganz neu bei Haskell, warum funktioniert diese Funktion für immer?

Ich habe den folgenden Typ definiert.

data AnInteger = A Integer 
instance Eq AnInteger where 
    a == a' = a == a' 

Aber wenn ich versuche, es zu benutzen

Screenshot of ghci infinite looping

ich bekommen, was eine Endlosschleife zu sein scheint. Was geht hier vor, was ich nicht bekomme? Wie kann ich die Syntax korrigieren, um die gewünschte Ausgabe von True zu liefern?

+0

Es ist wie "main = main" sagen. Sie haben Gleichheit als rekursiven Aufruf an sich selbst definiert. – 4castle

+2

Bitte posten Sie in Zukunft den Bildtext, nicht das Bild. Die meisten Terminals lassen sie in irgendeiner Weise ausschneiden und einfügen. Bilder mit Text sind hier auf SO verpönt. – chi

Antwort

8

Sie definieren die == Betreiber sagen, dass a-a' iff a gleich ist, gleich a'. Logisch ist das eine Tautologie.

In Bezug auf Programm-Logik ist es eine Endlosschleife, wie die Anwendung der == Funktion auf zwei Argumente wird es wieder auf dieselben Argumente, unendlich anwenden.

Was Sie wahrscheinlich beabsichtigten zu tun, war == zu verwenden, um die Ganzzahlen zu vergleichen, die in Ihrem AnInteger s verpackt sind, anstatt die AnInteger s selbst. Um dies zu tun, müssen Sie zuerst Mustererkennung verwenden, um sie wie folgt auszupacken:

(A a) == (A a') = a == a' 
+0

Perfekt, danke! – Matt

Verwandte Themen