[Haskell-cafe] Reversing a string of words: C# v Perl V Ruby v Haskell

Andrew Savige ajsavige at yahoo.com.au
Sun Dec 10 06:50:38 EST 2006


Recently, the C# programmers at work have been asking job
applicants to write a function to reverse a string of words.
For example, given an input string of:

 "  one   two three four    "

the function should produce:

 "four three two one"

That is, the input string reversed word by word, with a single
space between each word and with no leading or trailing space.
(You may assume that the input string consists only of alphabetic
characters, spaces and tabs).

A popular C# approach goes something like:

 private static string reverseWords(string str) {
     string[] words = Array.FindAll<string>(str.Split(
                      new char[] {' ','\t'}),
                      delegate(string s) {
                         return !String.IsNullOrEmpty(s); });
     int i = words.Length - 1;
     if (i < 0)
         return String.Empty;
     StringBuilder sb = new StringBuilder(words[i]);
     while (--i >= 0)
         sb.Append(' ').Append(words[i]);
     return sb.ToString();
 }

Though the C# programmers seem happy enough with this solution,
it's a bit too verbose for my personal taste. For cheap thrills,
I'd like to show them some solutions to their little problem in
other, er, less verbose languages.

In Perl, I have:

 sub reverseWords {
     join ' ', reverse split(' ', shift)
 }

In Ruby:

 def reverseWords(str)
     str.split(' ').reverse.join(' ')
 end

Finally, and please don't laugh, in Haskell (GHC):

 reverseWords :: String -> String
 reverseWords xs = (concat (intersperse " " (reverse (words xs))))

which does appear to work correctly. However, I would like to do
justice to Haskell as a language -- and given that my clumsy
Haskell is not written in expert style -- I'm hoping that someone
on this list might offer a better, faster, or more idiomatic
Haskell solution to this little problem.

Thanks,
/-\


Send instant messages to your online friends http://au.messenger.yahoo.com 


More information about the Haskell-Cafe mailing list