More on "Component Programming"

Peter Alexander peter.alexander.au at gmail.com
Tue May 28 10:55:43 PDT 2013


On Tuesday, 28 May 2013 at 09:54:35 UTC, bearophile wrote:
> The "rewrite rules" is a feature of the GHC compiler. It allows 
> the library writers to define rules that in most (or many) 
> cases are advantageous and lead to better optimization. As 
> example one of such rules swap map and filter, putting the 
> filter before the map, because this is more efficient. Haskell 
> allows you to perform such swapping because (nearly) everything 
> it does is pure and immutable.

Phobos does this a little bit in simple cases. For example, 
retro(retro(r)) returns r if I remember correctly.

More complicated rewrites would be trickier to implement, and may 
be impossible cross-modules (I cannot provide a rewrite for 
retro(my.module.range) without modifying Phobos).

General rewrites, like the kind relational database query 
optimisers do, require statistics on the data structures. For 
example:

1) cartesianProduct(r1, r2).filter!(pred).sort("a[1]<b[1]")
2) cartesianProduct(r1, r2.sort("a[1]<b[1]")).filter!(pred)

Which is faster depends on the sizes of r1 and r2, and the pass 
ratio of the filter predicate.


More information about the Digitalmars-d mailing list