繁体   English   中英

地图或折叠树

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM