Zuweisen von "blanken" Zahlen zu neuen Typen

8

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.

    
mhwombat 17.04.2012, 13:05
quelle

2 Antworten

4

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.

Ссылка

    
hugomg 17.04.2012, 18:32
quelle
6

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.

    
mhwombat 17.04.2012 13:08
quelle

Tags und Links