Discussion: traversing roots and leaves
David Feuer
david.feuer at gmail.com
Mon Jan 23 20:07:59 UTC 2017
No, I don't think so. The trouble is that GHC can't assume the Applicative
instance is valid. Optimizing this requires knowledge of things like
liftA3 f (pure x) m (pure y) = (\m' -> f x m' y) <$> m
GHC can only discover such facts when enough inlining and/or specialization
happen. Also, figuring out how close you should get to the leaves before
trying to coalesce actions may be a judgement call in some cases.
On Jan 23, 2017 3:01 PM, "Mario Blažević" <mblazevic at stilo.com> wrote:
> On 2017-01-19 02:57 PM, David Feuer wrote:
>
>> 2. Leaves are really painful. Data structures that store at most one
>> element per leaf make obvious traversals expensive. For example, in
>> Data.Map, the obvious implementation would be
>>
>> instance Traversable (Map k) where
>> traverse _ Tip = pure Tip
>> traverse f (Bin s k v l r) =
>> liftA3 (Bin s k) (f v) (traverse f l) (traverse f r)
>>
>> The trouble is that we would generate a slew of `pure Tip`s that we'd
>> then have to combine. For instance, (Bin 1 k v Tip Tip) would give
>> liftA3 (Bin 1 k) (f v) (pure Tip) (pure Tip)
>>
>>
>> It makes me rather sad to have to write disgustingly ugly Traversable
>> instances just to avoid silly performance issues like this. Does anyone
>> have an idea for fixing (2), and ideally simultaneously taking care of
>> (1)?
>>
>
> I can't offer any immediate fix, but my impression of problem (2)
> is that it's for compiler to solve. I doesn't seem right that you should be
> manually enumerating all the simple cases close to the tips and inlining
> them explicitly.
>
> Since traverse is forcing the entire spine of the Map, there is
> not issue with the change in strictness. The compiler should in principle
> be smart enough to enumerate all possible node shapes and expand the
> function definitions for each of them. It would be similar to loop
> unrolling in some ways.
>
> Since this kind of transformation would probably be expensive at
> compile-time and would increase the generated code size, it should likely
> require a command-line option (-O2) or a pragma to activate.
>
> In short, the solution to problem #2 is to log a GHC proposal and
> get the burden off your shoulders.
>
> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/libraries/attachments/20170123/84eb32a9/attachment.html>
More information about the Libraries
mailing list