[Haskell-cafe] cutting long strings into lines
Matthias Fischmann
fis at wiwi.hu-berlin.de
Sat Sep 30 13:18:46 EDT 2006
On Sat, Sep 30, 2006 at 04:36:02PM +0100, Neil Mitchell wrote:
> (if you can't be bothered to do that, the answer is "lines" ;)
although this wasn't the original problem, i like it, too :). but now
i am stuck in finding an optimal implementation for lines. the
following implementation is slightly slower than the built-in
function, and i suspect this to stem from the occurrance of reverse
for each line:
cut1 :: String -> [String]
cut1 = f ""
where
f x "" = [reverse x]
f x ('\n':xs) = reverse x : f "" xs
f x (c:xs) = f (c:x) xs
i vaguely remember having seen a CPS trick here before, but all i can
come up with is the yet a little slower
cut2 :: String -> [String]
cut2 = f id
where
f k "" = [k ""]
f k ('\n':xs) = k "" : f id xs
f k (c:xs) = f k' xs where k' cs = k (c:cs)
also, i think both implementations are line-strict, that is, each line
is fully evaluated once touched in the first character.
is there a similar implementation, with CPS or not, that is lazy in
the lines and more efficient?
thanks,
matthias
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://www.haskell.org/pipermail/haskell-cafe/attachments/20060930/144e03d8/attachment.bin
More information about the Haskell-Cafe
mailing list