Was ist das C # -Äquivalent der Kartenfunktion in Haskell?


80

Die Kartenfunktion in Haskell verfügt über zwei Eingabeparameter. Der erste Parameter ist eine Funktion und der zweite Parameter ist eine Liste. Die Map-Funktion wendet die als Eingabeparameter übergebene Funktion auf alle Elemente in der Liste an und gibt eine neue Liste zurück.

Gibt es ein C #, das dieser Funktionalität entspricht?


1
Vielleicht möchten Sie F # auschecken. Es schließt die Lücke zwischen C # und Haskell.
ChaosPandion

3
Nicht wirklich. Es ist eher wie "OCaml für .NET".
Jrockway

2
Ganz zu schweigen davon, dass alle Sprachen der ML-Familie (einschließlich F # und Haskell) wohl mehr miteinander gemein haben als mit jeder Sprache der C-Familie. Jeder, der mit F # umgehen kann, kann wahrscheinlich auch mit Haskell oder OCaml umgehen.
CA McCann

1
@jrockway, @camccann: Ich spreche nicht über die Syntax der Sprache. Ich meine die Tatsache, dass F # Sie nicht zwingt, immer einen reinen Funktionsstil zu verwenden.
ChaosPandion

Antworten:


94

Select

MSDN-Referenz

Siehe meine Frage hier (Nur wenn Sie neugierig sind, da es nicht direkt damit zusammenhängt).


8
Danke ... Dies ist etwas kontraintuitiv. Ich dachte, Select würde Zeilen aus einer Sammlung filtern.
BM.

8
Ich hoffe wirklich, dass Sie meine Frage überprüfen.
ChaosPandion

1
BM: Filterung kommt von wo.
Edward KMETT

21

Eine andere Alternative zu Selectund SelectManybesteht darin, eine eigene Erweiterungsmethode zu schreiben.

public static IEnumerable<U> Map<T, U>(this IEnumerable<T> s, Func<T, U> f)
{
  foreach (var item in s)
    yield return f(item);
}

Danke Wes Dyer für diese süße Verlängerungsmethode! :) Siehe Beitrag für weitere Details.


15

Da Selectund SelectManybereits erwähnt, beantworte ich eine zusätzliche Frage, die Sie nicht gestellt haben: foldWird als Aggregat gefunden .

Jetzt sollte jeder, der dies liest, voll ausgestattet sein, um der Typ zu sein, der Sprache X mit Sprach-Y-Redewendungen schreibt. Lassen Sie sich also nicht zu sehr von Ihren C # -Kollegen mitreißen.


4
Nun, Camccann, es ist nichts Falsches daran, einen Funktionsschlüssel in Ihren Werkzeugkasten zu werfen, obwohl Sie unbedingt Nägel hämmern müssen. Möglicherweise müssen Sie einige Schrauben festziehen.
ChaosPandion

4
@camccan Functional C # ist wirklich ziemlich gut. Nur weil die Sprache nicht streng funktional ist, bedeutet dies nicht, dass die meisten .net-Programmierer nicht sehr davon profitieren würden, Dinge viel funktionaler zu gestalten.

4
Die Verwendung der von C # angebotenen funktionalen Programmierfunktionen ist eine gute Idee. Das Erzwingen von C # in funktionale Redewendungen, die es nicht gut unterstützt (z. B. Curry-Teilanwendung, wie es in Haskell so beliebt ist), wird Ihnen wahrscheinlich Kopfschmerzen bereiten, Ihren Code verschleiern und jeden anderen ärgern, der arbeiten muss damit.
CA McCann


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.