As other people have mentioned, you are duplicating library
functionality.  But nobody has actually talked about the performance
characteristics of your code.

Fortunately for you, the calls to (++) in your recursion are
right-associative, so you don't have an asymptotic problem where your
program gets slower and slower for large inputs; it should stay
linear.

But you are wasting some work.  In particular, (concat (intersperse "
" l)) produces a String, and then (++) duplicates all of the cons
cells in that string as it rebuilds it so that the tail connects with
the next string.

So there is a potential benefit to using a difference list, albeit
only by around a 2x factor.

  -- ryan

On Sat, Feb 6, 2010 at 4:42 AM, Mark Spezzano
<[email protected]> wrote:
> Hi,
>
> Just wondering whether I can use ShowS or tupling or Difference Lists to 
> speed up the following code?
>
> It's basic text processing. It takes in a list of Lines where each Line is a 
> list of Words and intersperses " " between them then concatenates them into a 
> longer String. Note that there is a recursive call and the ++ operator.
>
> Thanks
>
> Mark
>
>
> -- Function: joinLines
> -- Joins the Words within Lines together with whitespace and newline 
> characters
> -- Argument: Lines to pad with whitespace and newlines
> -- Evaluate: The processed and concatenated String
> joinLines :: [Line] -> String
> joinLines (l:[]) = concat (intersperse " " l)
> joinLines (l:ls) = (concat (intersperse " " l)) ++ ('\n':joinLines ls)
>
> _______________________________________________
> Haskell-Cafe mailing list
> [email protected]
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to