Haskell Language
Phantomtypen
Suche…
Anwendungsfall für Phantomtypen: Währungen
Phantomtypen sind nützlich für den Umgang mit Daten, die identische Darstellungen haben, aber nicht logisch vom selben Typ sind.
Ein gutes Beispiel ist der Umgang mit Währungen. Wenn Sie mit Währungen arbeiten, möchten Sie auf keinen Fall zwei Beträge verschiedener Währungen hinzufügen. Was wäre die Ergebniswährung von 5.32€ + 2.94$
? Es ist nicht definiert und es gibt keinen guten Grund, dies zu tun.
Eine Lösung dazu könnte ungefähr so aussehen:
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
data USD
data EUR
newtype Amount a = Amount Double
deriving (Show, Eq, Ord, Num)
Mit der Erweiterung GeneralisedNewtypeDeriving
können wir Num
für den Amount
ableiten. GHC verwendet die Num
Instanz von Double
.
Wenn Sie nun Eurobeträge mit (5.0 :: Amount EUR)
, haben Sie das Problem gelöst, doppelte Beträge auf der Typenebene getrennt zu halten, ohne Overhead zu verursachen. Sachen wie (1.13 :: Amount EUR) + (5.30 :: Amount USD)
führen zu einem Typfehler und erfordern, dass Sie die Währungsumrechnung entsprechend behandeln.
Eine umfassendere Dokumentation finden Sie im Wiki-Artikel zu haskell