Що таке C # еквівалент функції карти в Haskell


80

Функція map в Haskell має два вхідні параметри. Перший параметр - це функція, а другий параметр - список. Функція map застосовує функцію, передану як вхідний параметр, до всіх елементів у списку і повертає новий список.

Чи існує C #, еквівалентний цій функції?


1
Можливо, ви захочете перевірити F #. Це запобігає розриву між C # і Haskell.
ChaosPandion

3
Не зовсім. Це більше схоже на "OCaml для .NET".
jrockway

2
Не кажучи вже про те, що всі мови сімейства ML (включаючи F # та Haskell), можливо, мають більше спільного між собою, ніж з будь-якою мовою сім'ї C; кожен, хто може впоратися з F #, може, мабуть, обробляти Haskell або OCaml.
CA McCann

1
@jrockway, @camccann: Я не кажу про синтаксис мови. Я маю на увазі той факт, що F # не змушує вас завжди використовувати чисто функціональний стиль.
ChaosPandion

Відповіді:


94

Select

Посилання на MSDN

Дивіться моє запитання тут (Тільки якщо вам цікаво, оскільки воно безпосередньо не пов’язане).


8
Дякую ... Це трохи протилежне інтуїтивно, я думав, що Select відфільтрує рядки з колекції.
БМ.

8
Я дуже сподіваюся, ви перевірите моє запитання.
ChaosPandion

1
БМ: Фільтрування відбувається звідки.
Едвард КМЕТТ

21

Ще однією альтернативою Selectта SelectManyнаписанням власного методу розширення є.

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

Дякуємо Весу Дайєру за цей солодкий спосіб продовження! :) Докладніше див. У дописі .


15

Оскільки Selectі SelectManyвже були згадані, я відповім на додаткове запитання, яке ви не задавали: foldзнаходиться як Сукупний .

Тепер усі, хто читає це, повинні бути повністю готові стати тим Хлопцем, який пише мову X, використовуючи ідіоми Language Y ... так що заради своїх колег-програмістів на C # не надто захоплюйтеся.


4
Зараз camccann, немає нічого поганого в тому, щоб закинути функціональний ключ у свій набір інструментів, навіть якщо ви обов’язково забиваєте цвяхи. Можливо, доведеться затягнути кілька болтів.
ChaosPandion

4
@camccan Functional C # дійсно досить непоганий. Те, що мова не є суто функціональною, не означає, що більшість програмістів .net не отримають величезної вигоди від побудови речей набагато більш функціонально.

4
Використання функціональних функцій програмування, які пропонує C #, є чудовою ідеєю. З іншого боку, примушуючи C # до функціональних ідіом, які він погано підтримує (скажімо, частково застосоване додаток, яке так популярно в Haskell), можливо, вам заболить голова, затуманить ваш код і дратуватиме всіх, хто повинен працювати з цим.
CA McCann,

11

А щоб відповісти на запитання, яке ви не задавали, еквівалент Haskell прив'язки монади "послідовності" називається SelectMany у C #. Детальніше про це див. У чудовій статті Веса Дайєра:

http://blogs.msdn.com/wesdyer/archive/2008/01/11/the-marvels-of-monads.aspx



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.