List rooted trees: Difference between revisions

m
→‎{{header|Haskell}}: Simplified the Data.Tree version a little
m (→‎{{header|Haskell}}: Data.Tree variant – tidying.)
m (→‎{{header|Haskell}}: Simplified the Data.Tree version a little)
Line 562:
A variant expressed in terms of Data.Tree
 
<lang haskell>import Data.List (foldl', nub, sortBysortOn) --' strict variant of foldl
import Data.Ord (comparing)
import Data.Tree (Tree (..), foldTree)
Line 571:
bagPatterns n =
nub $
foldTree
bracketsFromTree
(\_ xs -> '(' : (concat xs <> ")"))
. depthSortedTree
. foldTree
( const (succNode <$> foldrlength ((+)<*> .sortOn rootLabel) 0 xs)
in Node )
. treeFromParentIndices
<$> parentIndexPermutations n
Line 581 ⟶ 584:
 
----------------------- DEFINITIONS ----------------------
depthSortedTree ::
(Enum a, Num a, Ord a) =>
Tree a ->
Tree a
depthSortedTree tree
| null (subForest tree) = Node 0 []
| otherwise =
let xs = depthSortedTree <$> subForest tree
in Node
(succ $ foldr ((+) . rootLabel) 0 xs)
(sortBy (flip (comparing rootLabel)) xs)
 
bracketsFromTree :: Tree a -> String
bracketsFromTree =
foldTree
(\_ xs -> '(' : (concat xs <> ")"))
 
parentIndexPermutations :: Int -> [[Int]]
Line 621 ⟶ 608:
{{Out}}
<pre>(()()()())
((())()(()))
((()()()()))
((())(()))
(()((()))())
((()()()))
(((())(())))
(((()())))
((((()))))</pre>
9,655

edits