ここでは折りたたむことはできません。これは、消費する再帰的な構造がないためです。むしろ基本値から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)