considerar:Cómo evitar la explosión cuadrática de instancias de clase de tipo?
{-# OPTIONS -fglasgow-exts #-}
data Second = Second
data Minute = Minute
data Hour = Hour
-- Look Ma', a phantom type!
data Time a = Time Int
instance Show (Time Second) where
show (Time t) = show t ++ "sec"
instance Show (Time Minute) where
show (Time t) = show t ++ "min"
instance Show (Time Hour) where
show (Time t) = show t ++ "hrs"
sec :: Int -> Time Second
sec t = Time t
minute :: Int -> Time Minute
minute t = Time t
hour :: Int -> Time Hour
hour t = Time t
class TimeAdder a b c | a b -> c where
add :: Time a -> Time b -> Time c
instance TimeAdder Second Second Second where
add (Time s1) (Time s2) = sec (s1 + s2)
instance TimeAdder Second Minute Second where
add (Time s) (Time m) = sec (s + 60*m)
instance TimeAdder Second Hour Second where
add (Time s) (Time h) = sec (s + 3600*h)
instance TimeAdder Minute Second Second where
add (Time m) (Time s) = sec (60*m + s)
instance TimeAdder Minute Minute Minute where
add (Time m1) (Time m2) = minute (m1 + m2)
instance TimeAdder Minute Hour Minute where
add (Time m) (Time h) = minute (m + 60*h)
instance TimeAdder Hour Second Second where
add (Time h) (Time s) = sec (3600*h + s)
instance TimeAdder Hour Minute Minute where
add (Time h) (Time m) = minute (60*h + m)
instance TimeAdder Hour Hour Hour where
add (Time h1) (Time h2) = hour (h1 + h2)
add (minute 5) (hour 2)
--125min
Aunque estoy muy emocionado de que cosas locas como esto funciona, me pregunto cómo se podría evitar la explosión cuadrática de TimeAdder
casos.
Las horas, los minutos y los segundos realmente no son tan buenos para un candidato para este tipo de seguridad de tipo, ya que por qué alguna vez tendrías una función que p. Ej. solo acepta tiempo en segundos? Un mejor ejercicio para este tipo de seguridad de tipo podría ser, por ejemplo, unidades físicas. Podrías decir 'Tiempo',' Masa', 'Longitud', etc. como tipos fantasma y tener cálculos tipo seguro para velocidad, energía, etc. Esto también ayudará con el número de instancias ya que no todos los tipos son intercambiables como en tu ejemplo de tiempo – shang
@shang: Esto es correcto. Debería haber mencionado que esto es solo un ejemplo de juguete para obtener un mejor manejo de las clases de tipos y los tipos fantasmas. Entiendo que para una aplicación del mundo real con unidades de tiempo, solo la primera respuesta de hammar sería mucho más práctica. – Landei