Haskell Language
Typy fantomów
Szukaj…
Przypadek użycia dla typów fantomowych: Waluty
Typy fantomów są przydatne w przypadku danych, które mają identyczne reprezentacje, ale nie są logicznie tego samego typu.
Dobrym przykładem jest obsługa walut. Jeśli pracujesz z walutami, absolutnie nigdy nie chcesz np. Dodawać dwóch kwot różnych walut. Jaka byłaby waluta wyniku 5.32€ + 2.94$
? Nie jest zdefiniowane i nie ma dobrego powodu, aby to zrobić.
Rozwiązanie tego mogłoby wyglądać mniej więcej tak:
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
data USD
data EUR
newtype Amount a = Amount Double
deriving (Show, Eq, Ord, Num)
Rozszerzenie GeneralisedNewtypeDeriving
pozwala nam wyprowadzić Num
dla typu Amount
. GHC ponownie wykorzystuje Double
„s Num
instancji.
Teraz, jeśli reprezentujesz kwoty w euro np. (5.0 :: Amount EUR)
, rozwiązałeś problem utrzymywania podwójnych kwot osobno na poziomie rodzaju bez wprowadzania narzutu. Rzeczy takie jak (1.13 :: Amount EUR) + (5.30 :: Amount USD)
spowodują błąd typu i wymagają odpowiedniego postępowania z przeliczaniem walut.
Bardziej wyczerpującą dokumentację można znaleźć w artykule wiki Haskell