我正在创建一个“Asteroids”的克隆版,并想要创建一个移动函数。我原以为可以在数据类型上使用模式匹配,但实际上类型签名与实际方法不符合。如果
move
函数中的Moving
数据类型中的参数t
是Bullet
数据类型,则我想使用不同的代码并尝试了这个方法,但它不起作用。除了制作专门的移动功能(这可能更好),还有其他想法吗?
因此,我有Moving Asteroid
和Moving Bullet
,并且想要根据Asteroid
或Bullet
的类型进行模式匹配(或其他未在此处发布的类型,以提供最小示例)
一句话描述move
函数应该做什么:对于所有类型的Moving o
,使用环绕移动,除了Moving Bullet
。
一些上下文代码:
data Moving s = Moving {
position :: Position,
velocity :: Velocity,
size :: Float,
specifics :: s
}
data Bullet = Bullet {
damage :: Int
}
| DeadBullet
data Asteroid = Asteroid
| DeadAsteroid
move :: Float -> Moving o -> Moving o
move secs (Moving (x, y) v@(vx, vy) s t@(Bullet _)) = Moving (x', y') v s t
where x' = (x + vx * secs)
y' = (y + vy * secs)
move secs (Moving (x, y) v@(vx, vy) s t) = Moving (x', y') v s t
where x' = (x + vx * secs) `mod'` width
y' = (y + vy * secs) `mod'` height
错误:
src\Controller.hs:100:42: error:
* Couldn't match expected type `o' with actual type `Bullet'
[可移动]
,因为它们被封装成了一个单一类型。同样地,由于Moving
不再具有多态性,你可以拥有包含Bullet
和Asteroid
的[Moving]
。 - jkeuhlen