Я создаю клон Астероидов и хочу создать функцию перемещения.Я думал, что мог бы использовать сопоставление с образцом для типов данных, но, конечно, сигнатура типа тогда не соответствует фактическому методу. Я хочу использовать другой код, если параметр t
в типе данных Moving
в функции move
имеет тип данных 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'