C# like F#
24. Februar 2008 – 17:49 von AndreasIn meinem vorherigen Post (F# Teil 3) habe ich unter anderem die Methode “iter” der F#-Klasse List verwendet. Darauf hatte Aaron als Kommentar auf meinen Eintrag folgende ähnliche Lösung in Ruby gepostet:
Code von Aaron:
>> ergebnis = lambda {|x, y| x*y }.call(2, 4)
=> 8
>> list = [”1″, “2″] + [] + [”3″]
=> [”1″, “2″, “3″]
>> printListItems = proc {|list| list.each {|i|
?> puts “Element der Liste: ” + i
>> }}
=> #
>> printListItems.call(list)
Element der Liste: 1
Element der Liste: 2
Element der Liste: 3
=> [”1″, “2″, “3″]
=> 8
>> list = [”1″, “2″] + [] + [”3″]
=> [”1″, “2″, “3″]
>> printListItems = proc {|list| list.each {|i|
?> puts “Element der Liste: ” + i
>> }}
=> #
>> printListItems.call(list)
Element der Liste: 1
Element der Liste: 2
Element der Liste: 3
=> [”1″, “2″, “3″]
Zur Erinnerung: Die “iter”-Funktion erhält als Argumente eine Funktion und eine Liste. Sie wendet dann die übergebene Funktion auf jedes Element der Liste an. Warum die C#-Listen-Klasse nicht um die F#-”iter”-Funktion erweitern (als Extension Method). Genau dies habe ich nun getan! Den Code hierzu (und einen kleinen Testaufruf) möchte ich euch nicht vorenthalten:):
-
public static class ExtensionMethods
-
{
-
/// <summary>
-
/// Funktionszeiger fuer eine generische
-
/// Funtkion mit einem Parameter und keinem
-
/// Rueckgabewert.
-
/// </summary>
-
/// <typeparam name="T">Typ des Parameters.</typeparam>
-
/// <param name="arg0">Parameter der Funktion.</param>
-
public delegate void Func<T>(T arg0);
-
-
/// <summary>
-
/// Die iter-Funktion erhaelt als Argumente eine Funktion
-
/// und eine Liste. Sie wendet dann die uebergebene Funktion
-
/// auf jedes Element der Liste an.
-
/// </summary>
-
/// <typeparam name="T">Typ der Elemente, der Liste.</typeparam>
-
/// <param name="l">Extension-Method auf die C#-List-Class.</param>
-
/// <param name="func">Die Funktion, welche auf die Listenelemente
-
/// angewendet werden soll.</param>
-
public static void iter<T>(this List<T> l, Func<T> func)
-
{
-
// Ueber die Elemente der Liste iterieren
-
l.ForEach((T element) =>
-
{
-
// Die Funktion auf das jeweilige Element anwenden.
-
func(element);
-
});
-
}
-
}
-
-
class Program
-
{
-
-
static void Main(string[] args)
-
{
-
// Neue string-Liste erstellen
-
// Verwendung der iter-Funktion:
-
// Die Funktion "Console.Write" auf die string-
-
// Elemente anwenden.
-
list.iter<string>(Console.Write);
-
-
Console.ReadLine();
-
}
-
}

8 Responses to “C# like F#”
Also das kann ich auch
# Funktion:
itr() {
for ELEMENT in `echo $1`; do
$2 $ELEMENT
done
}
# Testen:
$ LIST=”eins zwei drei vier fuenf”
$ itr $LIST echo
eins
zwei
drei
vier
fuenf
Das war Bash
Zur Info: $ steht immer für den Prompt bei der Eingabe auf der Shell
By nougad on Feb 24, 2008
NACHTRAG: OK, das Bash Beispiel hatte wenig mit Funktionaler Programmierung zu tun. Deshalb hier noch ein Beispiel:
printListItems = function(list) {
document.writeln(list.shift());
if (list.length > 0) self.printListItems(list);
}
printListItems([”eins”, “zwei”, “drei”]);
By nougad on Feb 24, 2008
Das sieht stark nach JavaScript aus, das letzte Beispiel. In Bash wird es denke ich sehr schwer werden eine Art “iter”-Funktion zu implementieren, weil man einfach keine Blocks/Func-Objekte/Anonyme Funktionen als Parameter übergeben kann.
Interessant wäre es jetzt mal auszutesten ob man das mit reinem C (welches KEINE Blocks kennt) hinbekommen könnte (über einen Zeiger der auf eine Funktion zeigt vielleicht?)
By Aaron on Feb 24, 2008
Nicht ganz so schön dynamisch wie in Ruby aber geht
#include
void multiply(int x) {
printf(”%i * 10 = %i\n”, x, x*10);
}
void iteri(int *list, void (*func)(int)) {
int i;
for (i=0; i<=sizeof(list); i++) {
(*func)(list[i]);
}
}
int main() {
int list[] = {1, 2, 3, 4, 5};
iteri(list, multiply);
return 0;
}
By Aaron on Feb 24, 2008
Dieses Kommentarteil zensiert alle spitzen Klammern (< und >) sonst würde da auch JS stehen
Und bei dir fehlt die Include Anweißung. ANDREAS mach mal wieder hin
By nougad on Feb 24, 2008
Das Bsp. mit C fand ich ja mal cool! Den Zeiger auf Funktionen in C kannte ich bis grad auch noch nicht! Aber cool zu wissen:)! Was aber als Sprache ganz klar noch fehlt ist…. naa was wohl? Die Mutter aller Sprachen! Genau: A001101embler:D…
By Andreas on Feb 24, 2008
Hmm, stattdessen könnte man ja auch einfach ForEach benutzen…!?
var list = new List() { “sadf”, “lkjsh”, “sreli” };
list.ForEach( Console.WriteLine );
By Icke on Feb 25, 2008
Manchmal sieht man den Wald vor lauter Bäumen nicht :D. Du hast natürlich Recht! Prinzipiell ist meine “iter”-Funktion nur ein geschachtelter Aufruf der neuen ForEach-Funktion :).
By Andreas on Feb 25, 2008