2017-01-09 8 views
0

倍は:地図や木はのデータコンストラクタと型を持っている場合、ツリー

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がここにありますか?そして、どのようにそうすることができますか?

答えて

1

ここでは折りたたむことはできません。これは、消費する再帰的な構造がないためです。むしろ基本値から1つを作りたいと思っています。原則としてこれは展開されていますが、別の答えでCarlが言うように、私はCarlが実際にData.Listを使用するように提案しているとは思いません。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) 
0

Treeタイプのマップとフォールドの両方は、Treeを消費します。あなたはTreeを消費する必要はありません。どちらもうまくいきません。あなたはunfoldを探しています。見た目の例はData.List.unfoldrを参照してください。

関連する問題