Diseño de objetos móviles en Haskell

7

Supongamos que tengo un objeto que tiene un punto que denota su ubicación y forma.

type Point = (Double, Double)

data Object =
    Object { location :: Point
           , shape    :: Shape }

donde podría ser una forma

data Shape
    = Circle { radius :: Double }
    | Rectangle { height :: Double, width :: Double }

Supongamos que tengo una función que puede dibujar objetos.

draw :: [Object] -> IO ()

Hasta aquí no hay problemas.

Ahora, supongamos que quiero que los objetos se muevan. Así que los objetos deberían tener una velocidad.

type Velocity = (Double, Double)

data Object =
    Object { location :: (Double, Double)
           , shape    :: Shape
           , velocity :: Velocity }

type Time = Double

move    :: Time ->  Object  ->  Object
moveAll :: Time -> [Object] -> [Object]

El problema es que necesito un campo de velocidad para mover objetos, pero no necesito para dibujarlos.

Creo que permitir que la función draw sepa acerca de las interrupciones de velocidad del objeto abstracción. Estoy en lo correcto?

Cómo combinar la definición de objeto anterior con el campo de velocidad extra en orden mover objetos?

  • ¿Para usar tuplas como (Velocity, Object) ?
  • ¿Para envolver ambos en un nuevo tipo de datos? Si es así, ¿cómo llamar a ese tipo de datos?

Cualquier sugerencia es apreciada.

    
pregunta wowofbob 11.07.2016 - 15:39

2 respuestas

3

Podría declarar una clase de tipo para los objetos que conocen su ubicación y forma, y crear una instancia para Object . Entonces, su draw aceptaría cualquier instancia de esa clase de tipo, pero no podría encontrar ningún otro campo en Object .

    
respondido por el Jules 12.07.2016 - 11:29
5

Además de usar tuplas o envolver Object en un nuevo tipo de datos, otra opción es parametrizar Object con una variable de tipo:

data Object v =
    Object { location :: (Double, Double)
           , shape    :: Shape
           , velocity :: v } deriving (Functor)

Al pasar un objeto al renderizador, puede "silenciar" la velocidad almacenando un () , utilizando void myObject o tal vez utilizando una actualización polimórfica como myObject { velocity = () } .

    
respondido por el Daniel Díaz Carrete 11.07.2016 - 18:23

Lea otras preguntas en las etiquetas