Functional Programming in C# 2.0 - Folding

Late there has been quite a lot of talk about functional programming in C#. Efforts by Don Box, have been note and used on this blog several times and now that and now Sriram Krishnan has produced this nice piece on currying in C# 2.0.

 

One area that seams to have been over looked so far is folding. A folding function is similar to a mapping function and mapping functions are supported by the framework library in version 2.0, expect it calls it ConvertAll. For example, the framework defines the following method on the List<T> class:

 

public List<TOutput> ConvertAll<TOutput>(Converter<T, TOutput> converter);

 

It’s not hard to see this can be used to map one list to another, like so:

 

List<string> stringList =

intList.ConvertAll<string>(

delegate(int intput) { return intput.ToString(); }

);

 

Folding is similar, except that where a mapping function applies a transformation to a list a folding function produces a summary. F# defines a folding function on this list type like so:

 

let rec fold f acc l =

  match l with

    [] -> acc

  | (h::t) -> fold_left f (f acc h) t 

 

This is a function that has 3 parameters; the fist one of these is function that takes two parameters, the second is the accumulator and the third is the list to be folded. This translates to C# something like:

 

public delegate TReturn AStarBToB<TInput, TReturn>

(TInput value1,

TReturn value2);

 

public static TAcc Fold<TList, TAcc>(

AStarBToB<TList, TAcc> funct,

TAcc acc,

IEnumerable <TList> list)

{

         foreach (TList item in list)

{

                   acc = funct(item, acc);

         }

         return acc;

}

 

This provides a very easy to create summaries of lists:

 

// intList = {1, 2, 3, 4, 5, 6}

int result1

= Fold(

delegate(int value1, int value2) { return value1 + value2; },

0,

intList

);

// result1 = 21

 

string result2 =

Fold(

delegate(int value1, string value2) { return value2 + ", " + value1; },

"",

intList);

// result2 = “, 1, 2, 3, 4, 5, 6”

 

 

And that’s it! It takes just one line of code to produce a summering of a list and the technique can be applied to any object that supports the IEnumberable<T> interface, which is quite a few.

Bookmark
dotnetkicks+, digg+, reddit+, del.icio.us+, dzone+, facebook+

Print | posted @ Friday, August 12, 2005 7:44 PM

Comments on this entry:

No comments posted yet.

Your comment:

(Note: all comments are moderated so it may take sometime to appear)

Title:
Name:
Email:
Website:
 
Italic Underline Blockquote Hyperlink
 
 
Please add 8 and 6 and type the answer here:
 

Links

 Subscribe in a reader
Twitter Follow me on Twitter
FaceBook View my Facebook
LinkedIn View my LinkedIn Profile Viadeo Viadeo Profile (Français)

Badges


Disclaimer

The views expressed on this weblog are mine and do not necessarily reflect the views of my employer.

All postings are provided "AS IS" with no warranties, and confer no rights.


follow robertpi at http://twitter.com