
On Wed, 8 Dec 2004, Daniel Fischer wrote:
Am Mittwoch, 8. Dezember 2004 10:22 schrieben Sie:
On Tue, Dec 07, 2004 at 06:44:33PM +0100, Daniel Fischer wrote:
ms :: [Integer] -> [Integer] ms as = zipWith (+) (zipWith (*) as (1:ms as)) (0:1:ms as)
This version seems to be faster, but I don't know if it addresses your concern:
ms as = let l = zipWith (+) (zipWith (*) as (1:l)) (0:1:l) in l
Best regards, Tomasz
Thanks, indeed, this seems to produce roughly the same performance as 'ps' and I have a vague idea why this is better than 'pms', given that 'ms' is slower than 'ps'. But that is what baffled me in the first place, particularly because in hugs, things are different.
Is it possible and senseful for a compiler to extract common sub-expressions? Naively I think that for a given tree of an expression it is efficiently possible to find all common sub-trees. Referential transparency would assure that equal expressions have the same value, so they can be replaced by the same object. E.g. the example above could be automatically transformed to: ms as = let tmp0 = zipWith (+) (zipWith (*) as tmp1) (0:tmp1) tmp1 = 1:tmp0 in tmp0