Proposal: improve the Data.Tree API

Ivan Lazar Miljenovic ivan.miljenovic at gmail.com
Thu Feb 27 11:43:24 UTC 2014


And an Ord instance.

On 27 February 2014 22:34, João Cristóvão <jmacristovao at gmail.com> wrote:
> Hey,
> So, proposal 2.0, with the received feedback:
>
> -- | get the sub-tree rooted at the first (left-most, depth-first) occurrence
> -- of the specified node value
> lookupTree :: Eq a => a -> Tree a -> Maybe (Tree a)
>
> -- | get the sub-tree rooted at the first (left-most, depth-first) value that
> -- matches the provided condition
> findTree :: (a -> Bool) -> Tree a -> Maybe (Tree a)
>
> -- | get the sub-tree for the specified node value in the first tree in
> -- forest in which it occurs.
> lookupTreeInForest :: Eq a => a -> [Tree a] -> Maybe (Tree a)
>
> -- | keep only the elements that match the provided condition
> filter :: (a -> Bool) -> Tree a -> Tree a
>
> -- | Size of the (flattened) tree
> size :: Tree a -> Int
> size = getSum . F.foldMap (const $ Sum 1)
>
> -- | Maximum depth of tree
> maxDepth :: Tree a -> Int
>
> -- | Remove all nodes past a certain depth
> prune :: Int -> Tree a -> Tree a
>
> -- | Take the mirror-image of a tree
> mirror :: Tree a -> Tree a
> mirror (Node a ts) = Node a . reverse $ map mirror ts
>
> Any additions / comments?
> Thanks,
> João
>
> 2014-02-24 12:55 GMT+00:00 João Cristóvão <jmacristovao at gmail.com>:
>> Hi Ivan,
>>
>>
>>>> then what about the arguably better name `size`?
>>> Huh, I thought we already had that.
>>
>> We do?
>> If there is consensus I would then add `size` with the arguably more
>> efficient implementation:
>> size :: Tree a -> Int
>> size = getSum . F.foldMap (const $ Sum 1)
>>
>>
>>> * An Ord instance (achievable via standalone deriving, though this isn't
>>> ideal)
>>
>> Agreed.
>>
>>> * Functions to take/drop so many levels of the tree (take is
>>> relatively easy; drop would result in a Forest).
>>
>> Similar to treeprune in
>> http://hackage.haskell.org/package/hledger-lib-0.22.1/docs/Hledger-Utils.html#v:subtreeat
>> ?
>>
>>
>>> mirror :: Tree a -> Tree a
>>> mirror (Node a ts) = Node a . reverse $ map mirror ts
>>
>> I don't have strong feeling about this one, but if more people see as
>> useful, why not...
>>
>> João
>>
>>
>> 2014-02-24 11:38 GMT+00:00 Ivan Lazar Miljenovic
>> <ivan.miljenovic at gmail.com>:
>>
>>> On 24 February 2014 22:17, Tobias Florek <haskell at ibotty.net> wrote:
>>> > hi,
>>> >
>>> >> But to be honest, I don't have strong feelings about this, I'm willing
>>> >> to drop this particular function (length) from the proposal, if there
>>> >> is
>>> >> no consensus.
>>> >
>>> > then what about the arguably better name `size`?
>>>
>>> Huh, I thought we already had that.
>>>
>>> Some things I missed when I last used Data.Tree:
>>>
>>> * An Ord instance (achievable via standalone deriving, though this isn't
>>> ideal)
>>>
>>> * A function to take the mirror-image of a tree (name not that important):
>>>
>>> mirror :: Tree a -> Tree a
>>> mirror (Node a ts) = Node a . reverse $ map mirror ts
>>>
>>> * Functions to take/drop so many levels of the tree (take is
>>> relatively easy; drop would result in a Forest).
>>>
>>>
>>> >
>>> > cheers,
>>> >  tobias florek
>>> >
>>> >
>>> > _______________________________________________
>>> > Libraries mailing list
>>> > Libraries at haskell.org
>>> > http://www.haskell.org/mailman/listinfo/libraries
>>>
>>>
>>>
>>> --
>>> Ivan Lazar Miljenovic
>>> Ivan.Miljenovic at gmail.com
>>> http://IvanMiljenovic.wordpress.com
>>> _______________________________________________
>>> Libraries mailing list
>>> Libraries at haskell.org
>>> http://www.haskell.org/mailman/listinfo/libraries
>>
>>



-- 
Ivan Lazar Miljenovic
Ivan.Miljenovic at gmail.com
http://IvanMiljenovic.wordpress.com


More information about the Libraries mailing list