Это как раз к вопросу dynamic vs static в контексте компиляторов. Программист на Scheme, например, с трудом сможет себе вообразить сложности, которые заставили специалистов использовать монады для реализации комбинаторов парсеров. В целом, если говорить об общих подходах, то программирование на уровне комбинаторов как раз таким и является, на мой взгляд. В то время как монады — необходимая в некоторых случаях деталь реализации :)
Монады - с практической точки зрения - это прежде всего способ переиспользования кода, который использует данный тайпкласс для композиции значений.
И в этом смысле он достаточно ключевой, т.к. компизация такого плана встречается очень много где и его наличие позволяет более-менее удобно шарить реализации многих функций для совершенно различных типов.