Funktionen höherer Ordnung

Standard

Funktionale Programmierung ist ein Programmierparadigma, das Datenverarbeitung als Auswertung mathematischer Funktionen behandelt. Der Gegensatz dazu ist imperative Programmierung, die den Schwerpunkt auf Zustandsänderungen legt und die den derzeit am häufigsten verwendeten Programmiersprachen zugrunde liegt.

In funktionalen Programmiersprachen sind Funktionen ein wichtiges Konzept. Die Strukturierung des Programmcodes erfolgt mit Hilfe von Funktionen. Deshalb werde ich hier eine Reihe von Artikel veröffentlichen, die sich mit Funktionen in funktionalen Programmierspachen beschäftigen.

Funktionen höherer Ordnung

In funktionalen Programmiersprachen können Funktionen als Parameter an andere Funktionen übergeben oder als Rückgabewert verwendet werden. Solche Funktionen nennt man Funktionen höherer Ordnung.

Delegates ermöglichen es, dass man auch in C# Funktionen höherer Ordnung entwickeln kann. In der .NET-Klassenbibliothek finden sich einige Beispiele dafür, z.B. hat die Klasse System.Collections.Generic.List<T> eine Methode Sort, die als einzigen Parameter einen Delegate erwartet, der den Vergleich durchführen soll. Auch in LINQ gibt es einige Extension-Methods, die Delegates als Parameter bekommen.

Map, Filter und Fold

In funktionalen Programmiersprachen werden die drei Funktionen map, filter und fold häufig verwendet, um mit Listen und ähnlichen Datenstrukturen zu arbeiten. Alle drei Funktionen erwarten neben einer Liste eine Funktion als Parameter. Damit handelt es sich um Funktionen höherer Ordnung.

Map

Map wendet die angegebene Funktion auf jedes Element der Liste an und gibt eine Liste der Ergebnisse zurück. LINQ kennt die Extension-Method Select, die IEnumerable<T> erweitert und etwas Ähnliches macht:

    var numbers = new[] { 1, 2, 3, 4, 5 };
    var doubledNumbers = numbers.Select(x => x * x);

In F# sieht das so aus:

    let numbers = [1; 2; 3; 4; 5]
    let doubledNumbers = List.map (fun x -> x * x) numbers

let ist das wichtigste Schlüsselwort für das Programmieren in F#. Es wird verwendet, um Daten, berechnete Werte, Funktionen und Prozeduren zu definieren. Links steht üblicherweise der Bezeichner. Nach dem Gleichheitszeichen folgt ein Ausdruck.

Die Zeile let numbers = [1; 2; 3; 4; 5] weist dem Namen “numbers” die Liste [1; 2; 3; 4; 5] als Wert zu. In F# wird eine Liste in eckigen Klammern eingeschlossen und die einzelnen Listenelemente werden durch einen Strichpunkt (Semikolon) getrennt.

Die zweite Zeile ruft die Funktion map des Moduls List auf. Man sieht, dass es nicht notwendig ist, die Parameter in Klammern anzugeben. Der erste Parameter ist die Funktion, die auf jedes Listenelement angewandt werden soll. In unserem Beispiel ist das die anonyme Methode fun x -> x * x. In F# wird eine anonyme Methode mit dem Schlüsselwort fun deklariert. Danach folgen die Funktionsargumente und nach dem Pfeil folgt der Funktionskörper. Der zweite Parameter ist die Liste “numbers”. Das Ergebnis wird an den Namen “doubledNumbers” gebunden.

Filter

Mit filter lässt sich eine Liste nach einem bestimmten Kriterium filtern. Das Kriterium wird als Funktion angegeben, die true für alle Elemente zurückgeben soll, die in die Ergebnisliste aufgenommen werden sollen. Das Äquivalent in LINQ heißt Where.

    var numbers = new[] { 1, 2, 3, 4, 5 };
    var evenNumbers = numbers.Where (x => (x % 2) == 0);

Hier wieder das Beispiel in F#:

    let numbers = [1; 2; 3; 4; 5]
    let evenNumbers = List.filter (fun x -> (x % 2) = 0) numbers

An diesem Beispiel sieht man, dass Lambda-Ausdrücke und anonyme Methoden nicht immer besser lesbar sind. Um die Lesbarkeit zu erhöhen, können wir die obigen Beispiele umschreiben:

In C#:

    bool IsEven (int x)
    {
        return (x % 2) == 0;
    }
    
    var numbers = new [] { 1, 2, 3, 4, 5 };
    var evenNumbers = numbers.Where (IsEven);

Und in F#:

    let IsEven x = (x % 2) = 0
    let numbers = [1; 2; 3; 4; 5]
    let evenNumbers = List.filter IsEven numbers

Die erste Zeile definiert die Funktion IsEven, die einen Parameter x akzeptiert. Nach dem ersten Gleichheitszeichen folgt der Funktionskörper: (x % 2) = 0. Dieser Ausdruck berechnet den Rest der Division von x durch 2 und vergleicht ihn mit 0. Sowohl beim let`-Binding als auch beim Vergleich wird in F# ein einzelnes Gleichheitszeichen verwendet.

Fold

Fold berechnet einen akkumulierten Wert über alle Elemente einer Liste. Die Funktion gibt an, wie ein neuer akkumulierter Wert aus dem alten Wert und einem Listenelement ermittelt wird. Das LINQ Äquivalent ist Aggregate.

    var numbers = new[] { 1, 2, 3, 4, 5 };
    var sum = numbers.Aggregate (0, (s, x) => s + x);

Dieses Beispiel berechnet die Summe der Zahlen im Array. Um besser zu verstehen, wie Fold funktioniert, hier die Einzelschritte:

Bei Aufruf: s = 0, Liste: 1, 2, 3, 4, 5

  1. s = 0 + 1, Liste: 2, 3, 4, 5
  2. s = (0 + 1) + 2, Liste: 3, 4, 5
  3. s = ((0 + 1) + 2) + 3, Liste: 4, 5
  4. s = (((0 + 1) + 2) + 3) + 4 = 10, Liste: 5
  5. s = ((((0 + 1) + 2) + 3) + 4) + 5 = 15, Liste: –

Die Variable sum im obigen Beispiel hat also den Wert ((((0 + 1) + 2) + 3) + 4) + 5=15.

Hier in F#:

    let numbers = [1; 2; 3; 4; 5]
    let sum = List.fold (fun s x -> s + x) 0 numbers

Es gibt in F# die Möglichkeit, den Operator + als Funktion anzugeben. Statt 4 + 9 kann man also (+) 4 9 schreiben. Damit kann im obigen Beispiel die letzte Zeile so geschrieben werden:

    let sum = List.fold (+) 0 numbers

Es gibt zwei verschiedene Arten von Folds: left Fold und right Fold. In früheren F#-Versionen gab es die zwei Funktionen List.fold_left und List.fold_right. Diese wurden jedoch umbenannt und heißen jetzt fold (left fold) und foldBack (right fold). LINQs Aggregate-Funktion arbeitet wie ein left Fold.

Fazit

Funktionen höherer Ordnung sind ein wichtiges Mittel in der funktionalen Programmierung für die Wiederverwendung von Code. Gemeinsam mit anderen Konzepten ermöglichen sie den deklarativen Stil der funktionalen Programmierung.

302 thoughts on “Funktionen höherer Ordnung

  1. Howdy! Would you mind if I share your blog with my myspace group?

    There’s a lot of people that I think would really enjoy your content.
    Please let me know. Many thanks

  2. I love your blog.. very nice colors & theme. Did you create this website yourself or did you hire someone to do it for you?
    Plz reply as I’m looking to design my own blog and would like to know where
    u got this from. cheers

  3. Autoliker, autoliker, Facebook Liker, Status Liker, Photo Liker, Facebook Autoliker, autolike, Status Auto Liker, Working Auto Liker, Facebook Auto Liker, Autoliker, auto like, facebook auto liker, Auto Like, Autoliker Facebook, Photo Auto Liker, Fb Autoliker, Auto Liker, auto liker, Increase Facebook Likes

  4. ไลค์เพจ, เพิ่มไลค์เพจ, ปั๊มไลค์แฟนเพจ, เพิ่มไลค์เพจ ราคาถูก, ปั๊มไลค์เพจ facebook, ปั๊มไลค์เพจ, ปั้มไลค์แฟนเพจ, ปั้มไลค์เพจ, เพิ่มไลค์แฟนเพจ, ปั๊มไลค์เพจ, ปั้มเพจ

  5. ผู้นำด้านที่ปรึกษาการตลาดออนไลน์ของไทย เพิ่มไลค์ ปั้มไลค์แฟนเพจ รับเพิ่มไลค์แฟนเพจ เพิ่มยอดไลค์ ปั้มไลค์ ปั้มไลค์คนไทย

  6. Wow, awesome weblog structure! How lengthy have you been running
    a blog for? you made blogging look easy. The overall look of your website is
    excellent, let alone the content material!

  7. I don’t even know the way I finished up here, but I believed this submit
    was once good. I don’t recognize who you’re however certainly you are going to a well-known blogger in case you aren’t already.
    Cheers!

  8. I must thank you for the efforts you have put in writing this site.

    I am hoping to see the same high-grade blog posts from you later on as well.
    In fact, your creative writing abilities has motivated me to get
    my own, personal blog now 😉

  9. Hi, i read your blog occasionally and i own a similar one and i was just wondering if
    you get a lot of spam comments? If so how do you stop it, any plugin or anything you can recommend?
    I get so much lately it’s driving me insane so any assistance is very much appreciated.

  10. Hi there! I could have sworn I’ve been to this website before but after checking through some of the post I realized it’s new to me.
    Nonetheless, I’m definitely glad I found it and I’ll
    be bookmarking and checking back frequently!

  11. magnificent post, very informative. I wonder why the
    other experts of this sector do not realize this. You must
    proceed your writing. I am sure, you have a huge readers’ base already!

  12. Hi, I do think this is an excellent site. I stumbledupon it 😉 I may come back once
    again since i have saved as a favorite it. Money and freedom
    is the greatest way to change, may you be rich
    and continue to help others.

  13. Spot on with this write-up, I seriously believe this
    site needs far more attention. I’ll probably be returning to read
    through more, thanks for the advice!

  14. I do consider all of the ideas you’ve presented in your post.

    They are really convincing and will certainly work. Nonetheless, the
    posts are too brief for newbies. May you please prolong them a little
    from next time? Thanks for the post.

  15. wonderful issues altogether, you simply won a brand new reader.
    What might you recommend in regards to your post that you just made some days ago?
    Any positive?

  16. whoah this blog is wonderful i love reading your posts. Keep up the great work! You know, a lot of people are hunting around for this info, you could help them greatly.

  17. I’m still learning from you, but I’m trying to achieve my goals. I absolutely enjoy reading everything that is written on your site.Keep the tips coming. I loved it!

  18. Hi there, You have performed a fantastic job. I’ll definitely digg it and for my part recommend to my friends. I am confident they will be benefited from this website.

  19. hello!,I really like your writing very so much! proportion we communicate extra approximately your post on AOL?

    I need an expert on this area to unravel my problem. May be that’s you!
    Having a look forward to see you.

  20. Hi! Do you know if they make any plugins to assist with Search
    Engine Optimization? I’m trying to get my blog to
    rank for some targeted keywords but I’m not seeing
    very good success. If you know of any please share.
    Thanks!

  21. When I originally commented I clicked the “Notify me when new comments are added” checkbox and now each
    time a comment is added I get three e-mails with
    the same comment. Is there any way you can remove me from that
    service? Thanks a lot!

  22. Hmm it appears like your site ate my first comment (it was extremely long) so I guess I’ll just sum it up
    what I wrote and say, I’m thoroughly enjoying your blog.
    I as well am an aspiring blog blogger but I’m still new to everything.
    Do you have any helpful hints for beginner blog
    writers? I’d really appreciate it.

  23. I do not know if it’s just me or if everybody else experiencing problems with your site.

    It appears like some of the text on your
    content are running off the screen. Can someone else please provide feedback and let me know if this is happening to them too?

    This could be a issue with my internet browser because I’ve
    had this happen previously. Appreciate it

  24. Like Fanpage, รับไลค์ครบวงจรทั่วไทย, ปั้มไลค์เพจ, เพิ่มไลค์เพจ ราคาถูก, รับปั้มไลค์เพจ, รับไลค์แฟนเพจ, กดไลค์แฟนเพจ, บริการปั้มไลค์ฟรี, จ้างปั้มไลค์, รับทำเพจเฟสบุ๊ค, เพิ่มไลค์, ปั้มไลค์ทั่วไป, ไลค์คนไทย 100%, รับเพิ่ม Like Fanpage Facebook ราคาพิเศษ เหมาะสำหรับผู้ที่ต้องการเพิ่ม Like Fanpage ให้ดูเป็นความน่าเชื่อถือของร้าน, ปั้มไลค์ครบวงจร, เพิ่มไลค์แฟนเพจ, ปั้มไลค์ Facebook, การเพิ่ม Like เป็นการเพิ่มโอกาสทางการขายสินค้าของคุณนั่นเอง ด้วยงานบริการเพิ่มไลค์แฟนเพจระดับมืออาชีพ ประสบการณ์การทำงานหลายปี, ปั่นไลค์, จ้างไลค์รูป, โกงไลค์, ปั้มไลค์รูป Facebook, รับจ้างกดไลค์, จ้างกดไลค์, ปั้มไลค์ราคาถูก, รับ Like Fanpage, แฟนเพจพร้อมยอดไลค์, ปั้มไลค์ ในโทรศัพท์, กดไลค์, รับทำไลค์แฟนเพจจำนวนมาก, ปั้มไลค์เพจคนไทย, รับสร้างแฟนเพจพร้อมยอดไลค์, ซื้อไลค์แฟนเพจ, รับจ้างเพิ่มไลค์, บริการปั้มไลค์แฟนเพจฟรี, บริการเพิ่ม Like ให้แฟนเพจของคุณ โดยทีมงานระดับมืออาชีพ ในระยะเวลาอันสั้นและราคาถูก รับประกันไลค์จากคนไทย 100%, กด Like, ปั้มไลค์ฟรี, รับทำเพจสินค้าพร้อมยอดไลค์, Pump Like, เพิ่มไลค์แฟนเพจ ราคาถูก, บริการเพิ่มไลค์แฟนเพจฟรี, กดไลค์รูป, ปั้ม Like ฟรี, ปั้มไลค์รูปเฟส, ไลค์แฟนเพจ, ปั้มไลค์ง่ายๆ, ปั้มยอดไลค์เป็นคนไทย 100%, เพิ่มไลค์ฟรี, ไลค์แฟนเพจราคาถูก, ปั้มเพจเฟสบุ๊ค, Up Like Fanpage, ปั้มรูป, ปั้มเพจ, บริการเพิ่มไลค์เฟสบุ๊คให้แฟนเพจ, ปั้มไลค์เพจ Facebook, ปั้มเพจ เหมาะสำหรับผู้ที่ต้องการยอดไลค์เพจเพจเยอะๆ, รับทำไลค์ครบวงจร, เพิ่มไลค์คนไทย, เพิ่ม Like, เพิ่มไลค์เพจ, จ้างไลค์, ปั้มไลค์เพจฟรี, ไลค์แฟนเพจได้สูงสุดหนึ่งล้านไลค์, ปั้มโพสต์, ปั้มไลค์, Add Like Fanpage, ปั้มไลค์แฟนเพจ, Auto Like, ปั้มไลค์สถานะ, รับจ้างปั้มไลค์, ไลค์แฟนเพจเฟสบุ๊ค, จ้างเพิ่มไลค์, รับปั้มไลค์รูป, ปั้มไลค์เฟสบุ๊ค, รับเพิ่มไลค์, รับเพิ่มไลค์แฟนเพจ เป็นการโปรโมทแฟนเพจ เพื่อเพิ่มยอดขายสินค้าได้, รับเพิ่มไลค์แฟนเพจเฟสบุ๊ค, ปั้มไลค์รูป, ไลค์เพจ, ปั้มไลค์มือถือ

  25. เว็บปั้มไลค์, แฮกไลค์, ออโต้ไลค์, ปั้มไลค์รูปภาพ, Auto Like, Hack Like Facebook, ปั้มไลค์คอมเม้น, ปั้มไลค์, ระบบเพิ่มไลค์, ปั้มไลค์แฟนเพจ

  26. My spouse and i felt really cheerful that Jordan could finish off his investigation out of the precious recommendations he obtained from your web site. It is now and again perplexing to simply happen to be giving out techniques which often many people have been making money from. And we all acknowledge we’ve got the writer to appreciate for this. All the illustrations you’ve made, the straightforward blog navigation, the friendships you can give support to promote – it’s got mostly overwhelming, and it’s really assisting our son in addition to the family believe that that concept is pleasurable, which is rather mandatory. Thanks for the whole thing!

  27. I’m impressed, I have to admit. Genuinely rarely do I encounter a blog that’s both educative and entertaining, and without a doubt, you have hit the nail around the head. Your idea is outstanding; the problem is a thing that too little folks are speaking intelligently about. We are happy that we stumbled across this in my seek out something with this.

  28. I spent four years trying EVERYTHING in Online Dating, and through a huge amount of trial and error, I produced a system that I will share for you. This book will take you, step by step, through everything you need to know to double, triple or even quadruple the number of women you meet online.

  29. I spent four years trying EVERYTHING in Online Dating, and through a huge amount of trial and error, I produced a system that I will share for you. This book will take you, step by step, through everything you need to know to double, triple or even quadruple the number of women you meet online.

  30. I simply want to tell you that I’m all new to blogging and truly enjoyed you’re web-site. Very likely I’m want to bookmark your website . You absolutely have awesome well written articles. Appreciate it for revealing your web page.

  31. A lot of of the things you claim is supprisingly accurate and it makes me ponder the reason why I hadn’t looked at this in this light before. This article truly did turn the light on for me as far as this specific subject goes. Nonetheless at this time there is actually just one issue I am not necessarily too comfy with and whilst I make an effort to reconcile that with the main idea of the issue, permit me observe just what the rest of the visitors have to point out.Very well done.

  32. I wish to show my appreciation to you for rescuing me from this particular instance. As a result of scouting through the search engines and coming across ideas that were not helpful, I thought my entire life was gone. Being alive minus the strategies to the issues you’ve sorted out through your entire blog post is a critical case, and those which might have in a negative way affected my career if I hadn’t encountered your blog post. Your own personal expertise and kindness in dealing with the whole lot was crucial. I don’t know what I would’ve done if I hadn’t discovered such a stuff like this. I can at this moment relish my future. Thanks a lot very much for your professional and result oriented guide. I will not hesitate to propose your web site to anyone who wants and needs care on this issue.

Leave a Reply

Your email address will not be published.