在C#中使用Monads的令人信服的场景是什么?

时间:2009-05-15 03:53:28

标签: c# .net monads

让我先说明我对Monads有一种幼稚的理解。我已经阅读了Monads上的各种主题,并对这个概念进行了几个小时的研究。我对这个术语感到很不舒服,但我认为可以说我通常了解Monad是什么/做什么。

我是一名C#开发人员,希望改善我的工作方式。在我的Monaducation中,有什么能帮助我进一步看到Monad在C#中的真实世界应用(即通过linq SelectMany(或其他),这显然比在oldskool C#中解决同类问题的其他方法有所改进。 / p>

有没有人见过这样的野兽?

8 个答案:

答案 0 :(得分:11)

这是一个这样的场景:你想创作一个解析库(嵌入式DSL的一个很好的例子),你发现最好的是monadic解析器组合库。因此,您可以利用LINQ语法糖来编写C#代码,这些代码具有与您正在解析的语言语法相同的结构,并且您可以获得实时语义分析和错误恢复的强大编程模型的好处。有关说明,请参阅this blog

答案 1 :(得分:5)

找到毕达哥拉斯三重奏:

  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 };

答案 2 :(得分:4)

下面是一个这样的场景:你想要编写代码来进行顺序异步调用(例如IO)而不需要保存线程,但是你不想编写那些异步编程模型(BeginFoo / EndFoo)的意大利面条。迫使你进入。因此,您可以使用monad和LINQ糖并编写看起来直线的代码,但它会在整个过程中释放/切换线程。有关简短说明,请参阅this blog

答案 3 :(得分:3)

答案 4 :(得分:3)

一个例子是使用Maybe monad简化null检查,如this article所示。

答案 5 :(得分:0)

LINQ在StackOverflow上的许多解决方案(通常在问题中请求)中使用。使用LINQ标记查看问题,您将看到实际使用情况。

答案 6 :(得分:0)

使用monads进行编程是声明性的,在高级别描述您想要的内容,而不是如何生成它的低级细节。

请参阅exercises at the endBrian Beckman's state-monad talk on Channel 9

答案 7 :(得分:0)

I recently blogged关于将典型的命令式现实世界C#代码(NuGet中的函数)重构为功能性的monadic风格(更具体地说,使用 Maybe monad )。我尽力在很短的步骤内完成它,解释合理的步骤,所以我认为它有助于理解monad是如何有用的。