Поиск…


Вариант использования для фантомных типов: Валюта

Типы фантомов полезны для работы с данными, которые имеют идентичные представления, но не являются логически одного и того же типа.

Хорошим примером является валюта. Если вы работаете с валютами, вы абсолютно не хотите, например, добавлять две суммы разных валют. Какова будет валюта результата 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



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow