Haskell继承,数据,构造函数

时间:2018-10-19 16:01:35

标签: haskell inheritance

所以我想为我的Asteroids游戏/任务定义多个数据类:

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 :(得分:10)

您可能应该仅对所有这些使用单个数据类型,但是在特定详细信息中将其参数化

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

答案 1 :(得分:5)

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中。

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

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

(或参见@leftaroundabout's answer,这是处理此方法的一种更好的方法。)