Haskell Language
Типы фантомов
Поиск…
Вариант использования для фантомных типов: Валюта
Типы фантомов полезны для работы с данными, которые имеют идентичные представления, но не являются логически одного и того же типа.
Хорошим примером является валюта. Если вы работаете с валютами, вы абсолютно не хотите, например, добавлять две суммы разных валют. Какова будет валюта результата 5.32€ + 2.94$
? Это не определено, и для этого нет веских оснований.
Решение этого может выглядеть примерно так:
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
data USD
data EUR
newtype Amount a = Amount Double
deriving (Show, Eq, Ord, Num)
Расширение GeneralisedNewtypeDeriving
позволяет нам выводить Num
для типа Amount
. GHC повторно использует экземпляр Double
's Num
.
Теперь, если вы представляете суммы в евро, например, (5.0 :: Amount EUR)
вы решили проблему сохранения двойных сумм на уровне типа без введения накладных расходов. Такие вещи, как (1.13 :: Amount EUR) + (5.30 :: Amount USD)
, приведут к ошибке типа и потребуют надлежащего обращения с конверсией валюты.
Более полную документацию можно найти в статье wiki haskell