Каков убедительный сценарий использования монад в C # - PullRequest
21 голосов
/ 15 мая 2009

Позвольте мне заявить заранее, что у меня есть детское понимание Монад. Я прочитал различные темы о Монадах здесь и провел несколько часов изучения этой концепции. Я не чувствую себя комфортно с этим термином, но я думаю, что можно с уверенностью сказать, что я в общем понимаю, что такое Монада / что она делает.

Я разработчик на C #, который хочет улучшить свою работу. Что еще могло бы помочь мне в моем Monaducation, так это увидеть реальное применение Monad в C # (т.е. через linq SelectMany () или somesuch), которое явно лучше других способов решения такой же проблемы в oldskool C #. 1005 *

Кто-нибудь видел такого зверя?

Ответы [ 8 ]

11 голосов
/ 15 мая 2009

Вот один из таких сценариев: вы хотите создать библиотеку синтаксического анализа (хороший пример встроенного DSL) и обнаружите, что лучшие из них - библиотеки монадического анализатора синтаксического анализатора. Таким образом, вы пишете его, используя синтаксические сахара LINQ для написания кода C #, который имеет ту же структуру, что и грамматика языка, который вы анализируете, и получаете преимущества удивительной модели программирования для оперативного семантического анализа и восстановления после ошибок. , См. этот блог для описания.

5 голосов
/ 25 января 2010

Найти тройки пифагорейцев:

  var r = from a in Enumerable.Range(1, 25)
          from b in Enumerable.Range(a, 25-a)
          from c in Enumerable.Range(b, 25-b)
          where a*a + b*b == c*c
          select new [] { a, b, c };
4 голосов
/ 15 мая 2009

Вот один из таких сценариев: вы хотите написать код, который выполняет последовательные асинхронные вызовы (например, IO) без удержания потоков, но вы не хотите писать безнадежный клубок спагетти, который представляет собой модель асинхронного программирования (BeginFoo / EndFoo) заставляет вас в. Таким образом, вы можете использовать монаду и сахара LINQ и писать код, который выглядит прямолинейно, но он освобождает / переключает потоки по всему. См. этот блог для краткого описания.

3 голосов
/ 25 октября 2011

Один из примеров - упрощение null проверок с использованием монады Maybe, как показано в этой статье .

3 голосов
/ 16 мая 2009
0 голосов
/ 25 апреля 2011

Недавно я написал в блоге о рефакторинге типичного императивного реального кода C # (функция в NuGet ) в функциональном монадическом стиле (более конкретно, с использованием монады Maybe). ). Я сделал все возможное, чтобы сделать это в несколько шагов, объясняя рациональный шаг за шагом, поэтому я думаю, что это помогает понять, насколько полезны монады.

0 голосов
/ 15 июля 2009

Программирование с помощью монад является декларативным, описывая то, что вы хотите на высоком уровне, а не низкоуровневые детали того, как его генерировать.

См. упражнения в конце из Беседа с Брайаном Бекманом на канале 9 .

0 голосов
/ 15 мая 2009

LINQ используется во многих решениях (и часто запрашивается в вопросах) здесь, на StackOverflow. Просмотрите вопросы с тегом LINQ , и вы увидите реальное использование.

...