Наследование Haskell, данные, конструкторы - PullRequest
0 голосов
/ 19 октября 2018

Итак, я хочу определить несколько классов данных для моей игры / задания астероидов:

data One = One {oneVelocity :: Velocity, onePosition :: Position, (((other properties unique to One)))}
data Two = Two {twoVelocity :: Velocity, twoPosition :: Position, (((other properties unique to Two)))}
data Three = Three {threeVelocity :: Velocity, threePosition :: Position, (((other properties unique to Three)))}

Как вы можете видеть, у меня есть несколько классов данных с некоторыми перекрывающимися свойствами (скорость, положение).Это также означало, что мне приходилось давать им разные имена для каждого класса данных ("oneVelocity", "twoVelocity", ...).

Есть ли способ, позволяющий этим типам данных расширять что-то? Я думал об использовании одного типа данных с несколькими конструкторами, но некоторые из этих текущих классов данных сильно отличаются, и я не думаю, что они должны находиться в одном классе данных с несколькими конструкторами.

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Вам, вероятно, следует использовать только один тип данных для всех этих данных, но параметризованный для конкретных деталей:

data MovingObj s = MovingObj
        { velocity :: Velocity
        , position :: Position
        , specifics :: s }

Затем вы можете создать, например, asteroid :: MovingObj AsteroidSpecifics, но вытакже может писать функции, которые работают с любым таким движущимся объектом, как

advance :: TimeStep -> MovingObj s -> MovingObj s
advance h (MovingObj v p s) = MovingObj v (p .+^ h*^v) s
0 голосов
/ 19 октября 2018

В Haskell нет наследования (по крайней мере, такого, который вы ассоциируете с объектно-ориентированными классами).Вы просто хотите составить типы данных.

data Particle = Particle { velocity :: Velocity
                         , position :: Position 
                         }

-- Exercise for the reader: research the GHC extension that
-- allows all three of these types to use the same name `p`
-- for the particle field.
data One = One { p1 :: Particle
               , ... }
data Two = Two { p2 :: Particle
               , ... }
data Three = Three { p3 :: Particle
                   , ... }

Или вы можете определить тип, который инкапсулирует другие свойства, и позволить им добавляться к различным типам Particle s.

data Properties = One { ... } 
                | Two { ... }
                | Three { ... }

data Particle = Particle { velocity :: Velocity
                         , position :: Position
                         , properties :: Properties
                         } 

(Или см. @ ответ leftaroundabout , который является более хорошим способом обработки этого подхода.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...