[Haskell-beginners] Re: A better way?
Daniel Fischer
daniel.is.fischer at web.de
Sun Feb 22 10:17:24 EST 2009
Am Sonntag, 22. Februar 2009 15:30 schrieb Heinrich Apfelmus:
> Daniel Fischer wrote:
> > Yes, foldr was the wrong choice. make it foldl' (don't forget the prime
> > at the end) and it works for large tables. If the rows are short, it
> > actually is faster (here) than your version, but if the rows are long ,
> > e.g.
> >
> > maxTableColumnWidths (replicate 2000 (replicate 1000 "what?"))
> >
> > your version is faster than
> >
> > import Data.List (foldl')
> >
> > seqList [] = False
> > seqList (head:tail)
> >
> > | head `seq` False = undefined
> > | otherwise = seqList tail
> >
> > evalList xs
> >
> > | seqList xs = undefined
> > | otherwise = xs
> >
> > zipWithD :: (a -> a -> a) -> [a] -> [a] -> [a]
> > zipWithD f (x:xt) (y:yt) = f x y:zipWithD f xt yt
> > zipWithD _ [] ys = ys
> > zipWithD _ xs [] = xs
> >
> > maxTableColumnWidths =
> > foldl' ((evalList .) . zipWithD max) [] . map (map length)
>
> Nice! I'd use bang patterns in favor of the now outdated
>
> | x `seq` False = undefined
>
> pattern though.
I would, too, but they're not yet portable, are they?
Which implementations other than GHC currently support them?
And since seqList was already there, I used that.
>
>
> Actually, I'd use
>
> import Control.Parallel.Strategies
>
> maxWidths = foldl' (\xs ys -> zipWithD max xs ys `using` rnf) []
> . map (map length)
>
> The module quite useful for controlling evaluation, even when no
> parallelism is involved.
Winner!
>
>
> Regards,
> apfelmus
>
Cheers,
Daniel
More information about the Beginners
mailing list