[英]Map or fold tree
如果树具有数据构造函数和类型为:
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
需要生成无限游戏树的地方。
在这里首选fold
map
吗? 以及如何做到这一点?
您不能真正在这里折叠,因为您没有要使用的递归结构。 而是您想从一个基本值中产生一个。 原则上,这是一个展开过程,正如Carl在另一个答案中所说,但是我不认为Carl建议实际使用Data.List.unfoldr:unfoldr用于生成专门的列表。 您可以使用它来生成无限的逐渐更深的游戏树列表,实现某种迭代的加深,但是只需手动编写此递归函数,也许使用Data.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)
Tree
类型的map和fold都将消耗Tree
。 您没有要消耗的Tree
。 两者都不起作用。 您正在寻找一个unfold
。 有关数据外观的示例,请参见Data.List.unfoldr 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.