coder, gamer, parent
Learning haskell recently has really highlighted the power of the built in classes of haskell.
Compare a function in haskell to captialize the first letter in a sentence, vs c#.
1 2 3 4 5 | import Data.Char sentenceCase :: [Char] -> [Char] sentenceCase [] = [] sentenceCase (x:xs) = [toUpper x] ++ map toLower xs |
I think to be fair I should explain what the above function does.
Function | Description | |
---|---|---|
sentenceCase | The name of the function | |
(x:xs) | The brackets are grouping the notation x:xs together so it’s evaluated as a single argument. | |
x:xs | Is actually a special list shorthand that says for list xs, let the value x be the first element and xs be the remainder. Additionally this could be expressed as a:b:c:xs, abc representing the first 3 elements of the list and xs representing the remainder. | |
[] | The left and right square brackets represent a list, so in this case we’re creating a new list filled with 1 character which will be uppercase. | |
toUpper | From the Data.Char library accepts a Char and returns an upper case Char | |
toLower | From the Data.Char library accepts a Char and returns a lower case Char | |
map | Is a built in library function which performs a function on each individual member of a list and returns a resulting list. ie map (\x -> x * 2) [1,2,3] will return a list with the function (x * 2) applied to each of its elements [2,4,6] | |
++ | Concatenates two lists. |
So in 1 line of code you could read the above function as taking a list of characters, return the first element as uppercase and the remainder as lowercase.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public static string ToSentenceCase(this string original) { return String.IsNullOrEmpty(original) ? original : string.Format("{0}{1}", Head(original).ToUpper(), Tail(original).ToLower()); } public static string Head(this string original) { return String.IsNullOrEmpty(original) ? original : original.First().ToString(); } public static string Tail(this string original) { return String.IsNullOrEmpty(original) ? original : original.Substring(1, original.Length - 1); } |
To be fair, c# doesn’t have a Head or Tail method built in. However even using extension classes, the built in pattern matching from Haskell seems to be a far nicer solution language wise than c#.
Is there a way to refactor this c# code futher?
Justin is a Senior Software Engineer living in Brisbane. A Polyglot Developer proficient in multiple programming languages including [C#, C/C++, Java, Android, Ruby..]. He's currently taking an active interest in Teaching Kids to Code, Functional Programming, Robotics, 3D Printers, RC Quad-Copters and Augmented Reality.
Software Engineering is an art form, a tricky art form that takes as much raw talent as it does technical know how. I'll be posting articles on professional tips and tricks, dos and donts, and tutorials.
2 Responses to Power of Haskell
Rob Gray
May 27th, 2011 at 11:04 pm
Why would you make such a thing ? :p
Justin
May 27th, 2011 at 11:40 pm
Oh I dunno… whimsy?
I’m sure it’ll be such a popular request, that they’ll add it to the CSS specification at some point.
text-transform: sentence-case. 😀