映射或折叠树

时间:2017-01-09 13:48:47

标签: haskell 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需要生成无限游戏树。

这里首选mapfold吗?人们将如何实现这一目标?

2 个答案:

答案 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