Что такое эквивалент C # функции карты в Haskell

80

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

Есть ли в C # эквивалент этой функциональности?

BM.
источник
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найдено как Aggregate .

Теперь каждый, кто читает это, должен быть полностью готов к тому, чтобы стать Тем Парнем, который пишет Язык X, используя идиомы Языка Y ... так что ради других программистов на C # не слишком увлекайтесь.

CA McCann
источник
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

Эрик Липперт
источник
1
Обновленная ссылка - blogs.msdn.microsoft.com/wesdyer/2008/01/10/…
Рафаэль Заяс,