次のデータ型定義があるとします。
data FormTree = Empty | Node FormTree FormTree deriving Show
ノードの量などの長さでソートされたすべての可能なツリーを含む無限リストを生成する関数を書きたいと思います。
次のコードは、必要なことをほぼ実行しますが、毎回追加のノードを挿入して右側のツリーを下るだけですが、両側を交互に切り替える必要があります。
allPossibleTrees :: [FormTree]
allPossibleTrees = Empty : [Node x y | x <- recursive, y <- recursive]
where recursive = allPossibleTrees
実行中
take 5 allPossibleTrees
与えます:
[Empty,Node Empty Empty,Node Empty (Node Empty Empty),Node Empty (Node Empty (Nodes Empty Empty)),Node Empty (Node Empty (Node Empty (Node Empty Empty)))]
しかし、それは次のようなものでなければなりません:
[Empty,Node Empty Empty,Node (Node Empty Empty) Empty,Node Empty (Node Empty Empty),Node (Node Empty Empty) (Node Empty Empty)]