小编Nor*_*oen的帖子

Haskell设计包含几个monad

试图学习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中有意义,我想要一些输入.

haskell design-patterns

9
推荐指数
1
解决办法
514
查看次数

重新设计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)

haskell typeclass evolutionary-algorithm

4
推荐指数
1
解决办法
567
查看次数