
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