gpt4 book ai didi

不同数据类型的 Haskell 模式匹配

转载 作者:行者123 更新时间:2023-12-05 00:48:10 25 4
gpt4 key购买 nike

我正在创建 Asteroids 克隆并想要创建移动功能。我以为我可以在数据类型上使用模式匹配,但是类型签名当然不符合实际方法。 如果 move 函数中 Moving 数据类型中的 t 参数是数据类型 ,我想使用不同的代码Bullet 并尝试了这个,但这不起作用。 除了制作专门的移动功能之外的任何想法(这里可能会更好,但我仍然想知道是否有其他方法)。 p>

所以我有 Moving AsteroidMoving Bullet 并且想要在 AsteroidBullet (或其他类型,我没有在这里给出一个最小的例子)

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 o 是多态的。如果你有一个只移动项目符号的函数,Moving Bullet 可以像这样进行模式匹配。

有很多不同的方法可以解决这个问题。一个简单的解决方案是,根据游戏的其他方面,将 BulletAsteroid 合并为一个Movable 数据类型,您可以对其进行模式匹配:

data Moving = Moving {
position :: Position,
velocity :: Velocity,
size :: Float,
specifics :: Movable
}

data Movable = B Bullet | A Asteroid

data Bullet = Bullet {
damage :: Int
}
| DeadBullet

data Asteroid = Asteroid
| DeadAsteroid

move :: Float -> Moving -> Moving
move secs (Moving (x, y) v@(vx, vy) s t@(B _)) = 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

关于不同数据类型的 Haskell 模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52949311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com