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


80

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

Есть ли в 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найдено как Aggregate .

Теперь каждый, кто читает это, должен быть полностью готов к тому, чтобы стать Тем Парнем, который пишет Язык X, используя идиомы Языка 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.