[Haskell-cafe] efficient chop

Kazu Yamamoto ( 山本和彦 ) kazu at iij.ad.jp
Wed Sep 14 08:59:05 CEST 2011


Hello,

My friend reached the following version:

chop :: String -> String
chop = foldr go []
  where
    go x xs
      | isSpace x && null xs = []
      | otherwise            = x:xs

This version is faster than the reverse version in most cases.  The
point is checking "isSpace" first and falling into "otherwise" in many
cases, which is a natural co-recursion.

Thanks anyway.

--Kazu

>> Hello,
>> 
>> Of course, I use ByteString or Text for real programming. But I would
>> like to know whether or not there are any efficient methods to remove
>> a tail part of a list.
>> 
>> --Kazu
> 
> In that case, I would prefer this version, since it is lazier:
> 
> lazyChop :: String -> String
> lazyChop s = pref ++ if null s' then [] else (mid_sp ++ lazyChop s')
>   where
>     (pref,sp_suf) = break isSpace s
>     (mid_sp,s')   = span isSpace sp_suf
> 
> By "lazier" I mean:
> 
> *Main> chopReverse $ "hello world " ++ undefined
> "*** Exception: Prelude.undefined
> *Main> chopFoldr $ "hello world " ++ undefined
> "*** Exception: Prelude.undefined
> *Main> lazyChop $ "hello world " ++ undefined
> "hello world*** Exception: Prelude.undefined
> 
> Daniel



More information about the Haskell-Cafe mailing list