Safe Haskell | None |
---|
Split tree for transforming pattern clauses into case trees.
The coverage checker generates a split tree from the clauses. The clause compiler uses it to transform clauses to case trees.
The initial problem is a set of clauses. The root node designates on which argument to split and has subtrees for all the constructors. Splitting continues until there is only a single clause left at each leaf of the split tree.
- type SplitTree = SplitTree' QName
- type SplitTrees = SplitTrees' QName
- data SplitTree' a
- = SplittingDone {
- splitBindings :: Int
- | SplitAt {
- splitArg :: Int
- splitTrees :: SplitTrees' a
- = SplittingDone {
- type SplitTrees' a = [(a, SplitTree' a)]
- data SplitTreeLabel a = SplitTreeLabel {
- lblConstructorName :: Maybe a
- lblSplitArg :: Maybe Int
- lblBindings :: Maybe Int
- toTree :: SplitTree' a -> Tree (SplitTreeLabel a)
- toTrees :: SplitTrees' a -> Forest (SplitTreeLabel a)
- newtype CName = CName String
- testSplitTreePrinting :: IO ()
Documentation
type SplitTree = SplitTree' QNameSource
type SplitTrees = SplitTrees' QNameSource
data SplitTree' a Source
Abstract case tree shape.
SplittingDone | No more splits coming. We are at a single, all-variable clause. |
| |
SplitAt | A split is necessary. |
|
Eq a => Eq (SplitTree' a) | |
Show a => Show (SplitTree' a) | |
Arbitrary a => Arbitrary (SplitTree' a) |
type SplitTrees' a = [(a, SplitTree' a)]Source
Split tree branching. A finite map from constructor names to splittrees A list representation seems appropriate, since we are expecting not so many constructors per data type, and there is no need for random access.
Printing a split tree
data SplitTreeLabel a Source
SplitTreeLabel | |
|
Show a => Show (SplitTreeLabel a) |
toTree :: SplitTree' a -> Tree (SplitTreeLabel a)Source
Convert a split tree into a Tree
(for printing).
toTrees :: SplitTrees' a -> Forest (SplitTreeLabel a)Source