gpt4 book ai didi

haskell - 简化一些 Haskell 代码

转载 作者:行者123 更新时间:2023-12-02 12:46:32 24 4
gpt4 key购买 nike

因此,我正在为类似西洋跳棋的游戏开发一个极小极大实现,以帮助自己更好地学习 Haskell。我遇到问题的函数需要一个游戏状态列表,并生成直接后继游戏状态列表。就像跳棋一样,如果可以跳跃,玩家就必须跳跃。如果有多个,玩家可以选择。

在大多数情况下,这与列表单子(monad)配合得很好:循环所有输入游戏状态,循环所有可以跳跃的弹珠,循环该弹珠的所有跳跃。这个列表单子(monad)很好地将所有列表展平为最后的简单状态列表。

诀窍是,如果给定的游戏状态没有找到跳转,我需要返回当前的游戏状态,而不是空列表。下面的代码是我想出的最好的方法,但对我来说它看起来真的很难看。关于如何清理它有什么建议吗?

eHex :: Coord -> Coord -- Returns the coordinates immediately to the east on the board
nwHex :: Coord -> Coord -- Returns the coordinates immediately to the northwest on the board

generateJumpsIter :: [ZertzState] -> [ZertzState]
generateJumpsIter states = do
ws <- states
case children ws of
[] -> return ws
n@_ -> n
where
children ws@(ZertzState s1 s2 b p) = do
(c, color) <- occupiedCoords ws
(start, end) <- [(eHex, wHex), (wHex, eHex), (swHex, neHex),
(neHex, swHex), (nwHex, seHex), (seHex, nwHex)]
if (hexOccupied b $ start c) && (hexOpen b $ end c)
then case p of
1 -> return $ ZertzState (scoreMarble s1 color) s2
(jumpMarble (start c) c (end c) b) p
(-1) -> return $ ZertzState s1 (scoreMarble s2 color)
(jumpMarble (start c) c (end c) b) p
else []

编辑:提供 *Hex 函数的示例类型签名。

最佳答案

The trick is that, if no jumps are found for a given game state, I need to return the current game state, rather than the empty list.

为什么?我已经写过几次 minimax,但我无法想象这样的函数的用途。使用 type 函数不是会更好

nextStates :: [ZertzState] -> [Maybe [ZertzState]]

nextStates :: [ZertzState] -> [[ZertzState]]

但是,如果您确实想返回“下一个状态的列表,或者如果该列表为空,则返回原始状态”,那么您想要的类型是

nextStates :: [ZertzState] -> [Either ZertzState [ZertzState]]

然后你就可以很容易地将其压平。

至于如何实现,我建议定义一个 type 的辅助函数

[ZertzState] -> [(ZertzState, [ZertzState])]

比你能映射的

(\(start, succs) -> if null succs then Left start else Right succs)

结果,加上其他各种事情。

正如 Fred Brooks 所说(释义),一旦类型正确,代码实际上就会自行编写。

关于haskell - 简化一些 Haskell 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1231782/

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