Ich muss eine Typklasse definieren Truthy
, die eine Methode true
enthält, die eine Instanz der Typklasse in einen Bool
-Wert konvertiert.
Meine Typklasse-Deklaration:
%Vor% Als nächstes muss ich Instanzen dieser Klasse für verschiedene Typen definieren, einschließlich Listen- und numerischer Typen. Ich habe es für Listen und Int
s getan, aber gibt es eine Möglichkeit, dies für alle numerischen Typen gleichzeitig zu tun?
Basierend auf meiner Int-Deklaration:
%Vor%Ich habe versucht, eine Klassenbeschränkung hinzuzufügen, aber es funktioniert nicht:
%Vor%Wenn es eine Möglichkeit gibt, dies ähnlich zu tun, wie ich es mir vorgestellt habe, oder sollte ich es nur für jeden numerischen Typ separat definieren?
Das hilft vielleicht nicht bei den Hausaufgaben, aber Sie können eine solche Erklärung schreiben. Sie müssen dazu nur -XFlexibleInstances
aktivieren. Zumindest in GHC können Sie dies tun, indem Sie oben in Ihrer Datei ein Pragma setzen:
Wenn Sie sich die Fehlermeldung, die Sie erhalten haben, genau ansehen, wird etwas wie "Use -XFlexibleInstances" angezeigt, wenn Sie dies deaktivieren möchten.
In diesem speziellen Fall müssten Sie auch UndecideableInstances
und OverlappingInstances
:
Sie benötigen FlexibleInstances
, weil Standard-Haskell keine Instanzen in irgendeiner Form zulässt, in denen die Typvariable mehr als einmal im Kopf erscheint. Das ist völlig in Ordnung - ich es ist eine der am häufigsten verwendeten Erweiterungen (nach diese Frage ).
Sie benötigen UndecideableInstances
, weil Ihre Instanzdeklaration möglicherweise dazu führen kann, dass die Typprüfung für immer eine Schleife ausführt. Ich denke, die Verwendung von UndecideableInstances
verhindert dies, indem es einschränkt, wie tief es überprüft wird, wenn versucht wird, die Instanz zu reduzieren. Dies ist normalerweise - einschließlich in diesem Fall - in Ordnung, könnte aber theoretisch machen, ob ein bestimmtes Programm die Typprüfungen implementierungsabhängig besteht. Trotzdem sollte es in deinem Fall funktionieren.
Wie hammar gezeigt hat, müssen Sie OverlappingInstances
aktivieren, da der "Kontext" der Instanz ignoriert wird, wenn überprüft wird, ob sie sich überschneiden. Der Kontext ist in diesem Fall das Num a
-Bit. So werden die Instanzen - um zu überprüfen, ob sie sich überlappen - als instance Truthy a...
gelesen und überlappen sich mit allem. Wenn OverlappingInstances
aktiviert ist, müssen Sie nur eine Instanz haben, die am spezifischsten dafür ist.
Tags und Links haskell