Haskell Language
Tipos fantasma
Buscar..
Caso de uso para tipos fantasmas: Monedas
Los tipos fantasma son útiles para tratar con datos, que tienen representaciones idénticas pero no son lógicamente del mismo tipo.
Un buen ejemplo es tratar con monedas. Si trabaja con monedas, absolutamente nunca querrá, por ejemplo, agregar dos cantidades de monedas diferentes. ¿Cuál sería la divisa resultante de 5.32€ + 2.94$
? No está definido y no hay una buena razón para hacer esto.
Una solución para esto podría ser algo como esto:
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
data USD
data EUR
newtype Amount a = Amount Double
deriving (Show, Eq, Ord, Num)
La extensión GeneralisedNewtypeDeriving
nos permite derivar Num
para el tipo de Amount
. GHC reutiliza la instancia de Double
's Num
.
Ahora, si representa cantidades en euros con, por ejemplo, (5.0 :: Amount EUR)
, ha resuelto el problema de mantener las cantidades dobles separadas en el nivel de tipo sin introducir gastos generales. Cosas como (1.13 :: Amount EUR) + (5.30 :: Amount USD)
resultarán en un error de tipo y requerirán que trate con la conversión de moneda de manera apropiada.
Se puede encontrar documentación más completa en el artículo de haskell wiki.