data DumbTree = Empty | Fork DumbTree DumbTree -- trees :: 整数(>0)から,DumbTreeのリストへ trees :: Int -> [DumbTree] trees 1 = [Empty] trees n = concat [ joins ls rs | (ls,rs) <- [ lrs xs ys | (xs,ys) <- splits1 n ]] -- splits1 :: 整数(>0)から,和がその数になる整数(>0)の二つ組のリストへ splits1 :: Int -> [(Int,Int)] splits1 1 = [] splits1 n = (1,n-1) : [ (i+1,j) | (i,j) <- splits1 (n-1) ] -- lrs :: 2つの整数から,それぞれの大きさのDumbTreeのリストの二つ組へ lrs :: Int -> Int -> ([DumbTree],[DumbTree]) lrs xs ys = (trees xs, trees ys) -- joins :: 2つのDumbTreeのリストから,それらをそれぞれ左右にもつDumbTreeのリストへ joins :: [DumbTree] -> [DumbTree] -> [DumbTree] joins ls rs = [ Fork l r | l <- ls, r <- rs ] instance Show DumbTree where show Empty = "0" show (Fork l r) = "(" ++ show l ++ "^" ++ show r ++ ")"