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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow