Beachten Sie die zweite Zeile in dieser GHCi-Sitzung. Was ist mit dem Latitude-Typ, der es mir erlaubt, eine "bare" Zahl als Wert zu verwenden, anstatt einen Konstruktor aufzurufen? Ich möchte etwas Ähnliches mit einigen meiner eigenen Typen machen.
%Vor%Ich habe den Quellcode für den Latitude-Typ untersucht, aber ich hatte anfangs Schwierigkeiten, es herauszufinden. Schließlich fand ich die Antwort, also dachte ich, ich würde es hier dokumentieren. Siehe meine Antwort unten.
Laut dem Haskell98-Standard sind numerische Literale tatsächlich Aufrufe von fromInteger
und fromRational
. Dadurch können sie in einen beliebigen Typ konvertiert werden, der diese Funktionen implementiert ( fromInteger ist in der Prelude.Num-Typklasse und fromRational ist in der Prelude.Fractional typeclass).
Die Syntax von numerischen Literalen ist in Abschnitt 2.5 angegeben. Eine ganze Zahl Literal repräsentiert die Anwendung der Funktion fromInteger auf die geeigneter Wert vom Typ Integer. In ähnlicher Weise ein Floating-Literal steht für eine Anwendung von fromational auf einen Wert vom Typ Rational (also Verhältnis Integer). Angesichts der Typisierung:
fromInteger :: (Num a) = & gt; Ganzzahl - & gt; ein
fromRational :: (Fraktional a) = & gt; Rational - & gt; ein
Integer und Fließkomma-Literale haben die Typisierungen (Num a) = & gt; a und (Fraktional a) = & gt; a, jeweils. Numerische Literale sind in definiert dieser indirekte Weg, damit sie als Werte von irgendwelchen interpretiert werden können passender numerischer Typ. Siehe Abschnitt 4.3.4 für eine Diskussion von Mehrdeutigkeit überladen.
Was diese Arbeit macht ist, dass der Typ eine Num ist. Das geht am einfachsten mit "Ableiten von Num". In diesem Fall benötige ich das Sprach-Pragma GeneralizedNextypeDeriving. So kann ich einen Typ wie den folgenden erstellen,
%Vor%Und dann in GHCi,
%Vor%Alternativ könnte ich Num explizit implementieren.