在Haskell中匹配类型时遇到问题(generateTrees)

时间:2015-12-21 14:26:43

标签: haskell tree

我和两个人坐在一个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)

我们已经知道,功能的返回类型和我们的返回类型并不匹配,但在此必须有另一个错误。

我们将不胜感激任何帮助,提前谢谢

2 个答案:

答案 0 :(得分:1)

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

一般的unfold函数,给定类型s的种子和计算一层树的函数,通过在下一代种子上重复调用自身来生成整个树。该定义将具有类型:

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

然后,您可以使用此功能定义generateGameTree。使用unfold背后的直觉是类型seed的{​​{1}}代表游戏的状态,函数s计算一次移动后的可能新状态(与nextv“输出”)。

答案 1 :(得分:0)

可能感兴趣的人:

现在没有编译错误:

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