Каков убедительный сценарий использования Monads в С#
Позвольте мне заявить, что у меня есть инфантильное понимание Монад. Я прочитал различные темы в Monads здесь и провел несколько часов изучения концепции. Я почти не чувствую себя комфортно с этим термином, но я думаю, что можно с уверенностью сказать, что я вообще понимаю, что делает/делает Монада.
Я разработчик С#, который хочет улучшить способ работы. Что поможет мне дальше в моей Monaducation увидеть реальное приложение Monad в С# (то есть через linq SelectMany() или somesuch), что явно улучшает другие способы решения той же проблемы в oldskool С#.
Кто-нибудь видел такого зверя?
Ответы
Ответ 1
Вот один из таких сценариев: вы хотите создать библиотеку синтаксического анализа (хороший пример встроенного DSL), и вы обнаружите, что лучшие из них - это библиотеки монадических парсер-комбинаторов. Таким образом, вы пишете его, используя синтаксические синтаксисы LINQ для автора С# -кода, который имеет ту же структуру, что и грамматика языка, который вы разыгрываете, и вы получаете преимущества удивительной модели программирования для семантического анализа на лету и восстановления ошибок, См. этот блог для описания.
Ответ 2
Найдите тропы Пифагора:
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 };
Ответ 3
Вот один из таких сценариев: вы хотите написать код, который выполняет последовательные асинхронные вызовы (например, IO), не занимая потоки, но вы не хотите писать безнадежную путаницу спагетти о том, что модель программирования асинхронного программирования (BeginFoo/EndFoo) заставляет вас. Таким образом, вы можете использовать сахара-монады и LINQ и писать код, который выглядит прямолинейным, но он выпускает/переключает потоки повсюду. См. этот блог для краткого описания.
Ответ 4
проверить http://memoirsofaprogrammer.blogspot.com
Ответ 5
Одним из примеров является упрощение проверок null
с использованием монады Maybe, как показано в в этой статье.
Ответ 6
LINQ используется во многих решениях (и часто запрашиваемых в вопросах) здесь, в StackOverflow. Просмотрите вопросы с тегом LINQ, и вы увидите реальное использование в мире.
Ответ 7
Программирование с монадами является декларативным, описывающим то, что вы хотите на высоком уровне, а не низкоуровневые сведения о том, как его генерировать.
Смотрите упражнения в конце Брайан Бекман, monad talk на канале 9.
Ответ 8
Недавно я опубликовал блог о реорганизации типичного императивного реального С# кода (функция в NuGet) до функционального, монадического стиля (более конкретно, используя монаду Maybe). Я сделал все возможное, чтобы сделать это маленькими шагами, объясняя рациональный шаг за шагом, поэтому я думаю, что это помогает понять, насколько полезны монады.