在 Haskell (generateTrees) 中匹配类型有问题

Having trouble with matching type in Haskell (generateTrees)

我和两个人坐在一起做一个 haskell 项目,我们在使用以下代码时遇到了很多麻烦:

我尽力为您提供所有必要的信息:

来自模块 Types.hs:

class Game g s | g -> s where
  findPossibleMoves :: Player -> g -> [(s,g)]
  identifyWinner :: g -> Player -> Maybe Player 

data Player = Player1 | Player2 deriving (Eq,Ord)

这是我们要实现的代码:

generateGameTree :: Game g s => g -> Player -> Tree (g,Player) s
generateGameTree g p = ([ Node ((snd x),p) [] | x <- (findPossibleMoves p g )])

所以我们尝试编译这个东西,但它不起作用。了解树的外观可能很重要,这就是定义:

data Tree v e  = Node v [(e,Tree v e)] deriving (Show,Eq,Ord)

我们都知道,函数的returntype和我们的returntype不匹配,但是这里面肯定还有一个错误。

如有任何帮助,我们将不胜感激,在此先致谢

您可能希望将此操作分成两个较小的操作:

首先是一个通用的 unfold 函数,给定一个 s 类型的种子和一个计算一层树的函数,通过在下一代种子上重复调用自身来生成整棵树。此定义的类型为:

unfold :: (s -> (v, [(e,s)])) -> s -> Tree v e
unfold next seed = _fillThisIn

然后您可以使用此函数来定义您的 generateGameTree。使用 unfold 背后的直觉是类型 sseed 表示游戏的状态,函数 next 计算一步后可能的新状态(连同ve "outputs").

可能感兴趣的人:

现在可以正常工作,没有编译器错误:

generateGameTree g p = Node (g,p) [ ((fst x),generateGameTree (snd x) (nextPlayer p)) | x <- (findPossibleMoves p g) ]