Jaki jest odpowiednik funkcji map w języku C # w Haskell


80

funkcja map w Haskell ma dwa parametry wejściowe. Pierwszy parametr to funkcja, a drugi to lista. Funkcja map stosuje funkcję przekazaną jako parametr wejściowy do wszystkich elementów na liście i zwraca nową listę.

Czy istnieje odpowiednik C # tej funkcji?


1
Możesz chcieć sprawdzić F #. Wypełnia lukę między C # a Haskellem.
ChaosPandion

3
Nie całkiem. Bardziej przypomina „OCaml for .NET”.
jrockway

2
Nie wspominając już o tym, że wszystkie języki z rodziny ML (w tym F # i Haskell) mają prawdopodobnie więcej wspólnego ze sobą niż z jakimkolwiek językiem z rodziny C; każdy, kto potrafi obsłużyć F #, prawdopodobnie poradzi sobie również z Haskell lub OCaml.
CA McCann

1
@jrockway, @camccann: nie mówię o składni języka. Chodzi mi o to, że F # nie zmusza cię do używania czysto funkcjonalnego stylu.
ChaosPandion

Odpowiedzi:


94

Select

Dokumentacja MSDN

Zobacz moje pytanie tutaj (tylko jeśli jesteś ciekawy, ponieważ nie jest ono bezpośrednio związane).


8
Dzięki ... To trochę sprzeczne z intuicją, myślałem, że Select odfiltruje wiersze z kolekcji.
BM.

8
Naprawdę mam nadzieję, że sprawdzisz moje pytanie.
ChaosPandion

1
BM: Filtrowanie pochodzi z Skąd.
Edward KMETT

21

Inną alternatywą dla Selecti SelectManyjest napisanie własnej metody rozszerzenia.

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

Dzięki Wes Dyer za tę słodką metodę przedłużania! :) Zobacz post po więcej szczegółów.


15

Ponieważ Selecti SelectManyjuż zostało wspomniane, odpowiem na dodatkowe pytanie, którego nie zadałeś: foldjest znalezione jako agregowane .

Teraz wszyscy, którzy to czytają, powinni być w pełni wyposażeni, aby zostać tym facetem, który pisze język X przy użyciu idiomów języka Y ... więc dla dobra innych programistów C # nie dajcie się zbytnio ponieść emocjom.


4
Teraz camccann, nie ma nic złego w wrzuceniu funkcjonalnego klucza do skrzynki narzędziowej, nawet jeśli bezwzględnie wbijasz gwoździe. Być może będziesz musiał dokręcić kilka śrub.
ChaosPandion

4
@camccan Functional C # jest naprawdę całkiem niezłe. To, że język nie jest ściśle funkcjonalny, nie oznacza, że ​​większość programistów .net nie skorzystałaby na budowaniu dużo bardziej funkcjonalnych rzeczy .

4
Korzystanie z funkcji programowania funkcjonalnego, które oferuje C #, to świetny pomysł. Zmuszanie C # do funkcjonalnych idiomów, których nie obsługuje dobrze (powiedzmy, częściowa aplikacja curry, tak popularna w Haskell), z drugiej strony prawdopodobnie przyprawi cię o ból głowy, zaciemni twój kod i zirytuje każdego, kto musi pracować z tym.
CA McCann


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.