我和两个人坐在一个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)
我们已经知道,功能的返回类型和我们的返回类型并不匹配,但在此必须有另一个错误。
我们将不胜感激任何帮助,提前谢谢
答案 0 :(得分:1)
您可能希望将此操作拆分为两个较小的操作:
一般的unfold
函数,给定类型s
的种子和计算一层树的函数,通过在下一代种子上重复调用自身来生成整个树。该定义将具有类型:
unfold :: (s -> (v, [(e,s)])) -> s -> Tree v e
unfold next seed = _fillThisIn
然后,您可以使用此功能定义generateGameTree
。使用unfold
背后的直觉是类型seed
的{{1}}代表游戏的状态,函数s
计算一次移动后的可能新状态(与next
和v
“输出”)。
答案 1 :(得分:0)
可能感兴趣的人:
现在没有编译错误:
generateGameTree g p = Node(g,p)[((fst x),generateGameTree(snd x)(nextPlayer p))| x&lt; - (findPossibleMoves p g)]