2015-12-21 66 views
1

我坐在有两个家伙在Haskell的项目,我们有相当多的用下面的代码烦:具有带哈斯克尔(generateTrees)匹配型

我尝试给你所有必要的信息:

从模块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) 

我们媒体链接了解,该函数的返回类型和我们的返回类型不匹配,但必须有另一个错误在此。

我们希望得到任何帮助,在此先感谢

回答

1

您可以将此操作分成两个较小的:

一个通用unfold功能,第一部是给s类型的种子和函数计算一层树通过反复调用自己的下一代种子来生成一棵整棵树。此定义将具有以下类型:

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

然后您可以使用此功能来定义您的generateGameTree。使用unfold后面的直觉是s类型的seed表示游戏的状态,功能next计算一次移动后的可能新状态(连同ve“输出”)。

+0

非常感谢您,我们已经找到了解决方案! –

0

敬启者的兴趣:

这现在工作没有编译器错误:

generateGameTree GP =节点(G,P)[((FST x)中,generateGameTree(SND X)(nextPlayer p)的)| x < - (findPossibleMoves p g)]