[Haskell-cafe] Reversing a string of words: C# v Perl V Ruby v
Haskell
Bernie Pope
bjpop at csse.unimelb.edu.au
Mon Dec 11 22:20:15 EST 2006
On 12/12/2006, at 11:13 AM, Brandon S. Allbery KF8NH wrote:
>
> On Dec 11, 2006, at 18:48 , Steve Downey wrote:
>
>> the typical good solution to this problem in c or c++ is to use a
>> string reverse function on the entire buffer, then re-reverse each
>> word. this leaves multiple spaces correctly embedded in the larger
>> string.
>> that approach, of course, won't work in haskell, since it relies on
>> updates. but if the challenge includes transforming "one two three
>> four " into " four three two one", how could this be done?
>
> Off the top of my head, the C++ one translates to:
>
> *Main> concatMap reverse . groupBy (\l r -> (l == ' ') == (r == '
> ')) . reverse $ "one two three four "
> " four three two one"
>
> There are almost certainly more idiomatic ways to do it, but I'm
> still learning.
Perhaps something like this is close to the algorithm you describe:
import Data.Char (isSpace)
rev :: String -> String
rev str
= revAcc (reverse str) []
where
revAcc [] acc = acc
revAcc (x:xs) acc
| isSpace x = acc ++ (x : revAcc xs [])
| otherwise = revAcc xs (x : acc)
Cheers,
Bernie.
More information about the Haskell-Cafe
mailing list