我正在尝试在Haskell中编写一个双人游戏,比如跳棋.我设想有类型GameState,Move和result :: GameState -> Move -> GameState定义游戏规则的功能.我想拥有人工和自动播放器,我想我会通过一个类型类来做到这一点:
class Player p m | p -> m where
selectMove :: p -> GameState -> m Move
Run Code Online (Sandbox Code Playgroud)
其中的想法是m可以是基本AI玩家的身份,人类的IO,动态的AI状态,等等.问题是如何从这些到整个游戏循环.我想我可以定义类似的东西:
Player p1 m1, Player p2 m2 => moveList :: p1 -> p2 -> GameState -> m1 m2 [Move]
Run Code Online (Sandbox Code Playgroud)
一个monadic函数,它接收玩家和初始状态,并返回懒惰的动作列表.但最重要的是,我想要一个基于文本的界面,比如说,允许首先从一系列可能性中选择每个玩家,然后让游戏进行播放.所以我需要:
playGame :: IO ()
Run Code Online (Sandbox Code Playgroud)
我看不出如何以通用方式定义给定moveList的playGame.或者我的总体方法不对?
编辑:进一步思考它,我甚至没有看到如何定义上面的moveList.例如,如果玩家1是人类,那么IO和玩家2是有状态的AI,那么State,玩家1的第一步就是类型IO Move.然后玩家2必须采取结果状态IO GameState并产生类型的移动State IO Move,玩家1的下一步移动将是类型IO State IO Move?这看起来不对.