试图学习Haskell我正在Haskell中实现一个Quarto游戏.我已经在Python中实现了这个游戏,这是我去年开设的一个课程,其中的想法是与三个不同的"AI"玩家,一个随机玩家,一个新手玩家和一个minimax玩家一起实现游戏.片段逻辑和电路板逻辑很容易实现,但我已经到了需要实现播放器的地步,我想知道如何最好地设计播放器,以便游戏逻辑不需要知道任何东西关于特定的玩家,但仍然允许他们使用不同的monad.
问题是每个玩家需要不同的monad,随机玩家需要在State monad或RandomState monad中工作.新手玩家可能也需要某种形式的状态,而minimax玩家可能会使用状态或纯粹(这会使它变得更慢,实现起来有点棘手,但可以做到)另外我想要一个"人类" "玩家需要在IO monad中工作以获取人类的输入.一个简单的解决方案是将所有内容都放在IO monad中,但我觉得这有点使得个人设计变得更加困难,并迫使每个玩家的设计必须处理超出他们应有的程度.
我最初的想法是这样的:
class QuartoPlayer where
place :: (Monad m) => QuartoPiece -> QuartoBoard -> m (Int, Int)
nextPiece :: (Monad m) => QuartoBoard -> [QuartoPiece] -> m QuartoPiece
Run Code Online (Sandbox Code Playgroud)
我不知道这是否会起作用,因为我没有尝试过,但如果我朝着正确的方向前进并且如果设计在Haskell中有意义,我想要一些输入.
在得到一些帮助后,理解我试图编译代码的问题,在这个问题中(麻烦理解GHC关于模糊性的抱怨)Ness会建议我重新设计我的类型类以避免我不满意的解决方案.
有问题的类型是这些:
class (Eq a, Show a) => Genome a where
crossover :: (Fractional b) => b -> a -> a -> IO (a, a)
mutate :: (Fractional b) => b -> a -> IO a
develop :: (Phenotype b) => a -> b
class (Eq a, Show a) => Phenotype a where
--In case of Coevolution where each phenotype needs to be compared to every other in the population
fitness :: [a] -> a -> Int
genome …Run Code Online (Sandbox Code Playgroud)