在 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
背后的直觉是类型 s
的 seed
表示游戏的状态,函数 next
计算一步后可能的新状态(连同v
和 e
"outputs").
可能感兴趣的人:
现在可以正常工作,没有编译器错误:
generateGameTree g p = Node (g,p) [ ((fst x),generateGameTree (snd x) (nextPlayer p)) | x <- (findPossibleMoves p g) ]
我和两个人坐在一起做一个 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
背后的直觉是类型 s
的 seed
表示游戏的状态,函数 next
计算一步后可能的新状态(连同v
和 e
"outputs").
可能感兴趣的人:
现在可以正常工作,没有编译器错误:
generateGameTree g p = Node (g,p) [ ((fst x),generateGameTree (snd x) (nextPlayer p)) | x <- (findPossibleMoves p g) ]