如果树具有数据构造函数和类型:
data Tree m v = Tree v [(m, Tree m v)]
type GTree g = Tree (Move g) (Player, GameState g)
,其中
moves :: g -> Player -> GameState g -> [Move g]
move :: g -> Player -> GameState g -> Move g -> GameState g
tree :: Game g => g -> (Player, GameState g) -> GTree g
tree
需要生成无限游戏树。
这里首选map
到fold
吗?人们将如何实现这一目标?
答案 0 :(得分:1)
你不能在这里折叠,因为你没有一个递归的结构来消费;而你想要从基础值生成一个。原则上这是一个展开,正如卡尔在另一个答案中所说,但我不认为卡尔建议实际使用Data.List.unfoldr:展开用于生成特定列表。你可以使用它来生成一个逐渐深入的游戏树的无限列表,实现一种迭代加深,但是只需手动编写这个递归函数,也许使用数据就更简单了。 List.unfoldr作为模板来查看展开的工作原理。
这是一个对我来说似乎合理的实现,以及您提到但未定义的其他数据类型的虚拟定义,因此文件可以自行编译。
data Move g
data Player
data GameState g
class Game g
data Tree m v = Tree v [(m, Tree m v)]
type GTree g = Tree (Move g) (Player, GameState g)
moves :: g -> Player -> GameState g -> [Move g]
moves = undefined
move :: g -> Player -> GameState g -> Move g -> GameState g
move = undefined
tree :: Game g => g -> (Player, GameState g) -> GTree g
tree game (player, root) = expand root
where expand node = Tree (player, node) $ explore node
explore state = do
edge <- moves game player state
let node = move game player state edge
return (edge, expand node)
答案 1 :(得分:0)
Tree
类型的地图和折叠都会消耗Tree
。您没有Tree
消费。两个人都不会工作。您正在寻找unfold
。有关示例的示例,请参阅Data.List.unfoldr。