让我先说明我对Monads有一种幼稚的理解。我已经阅读了Monads上的各种主题,并对这个概念进行了几个小时的研究。我对这个术语感到很不舒服,但我认为可以说我通常了解Monad是什么/做什么。
我是一名C#开发人员,希望改善我的工作方式。在我的Monaducation中,有什么能帮助我进一步看到Monad在C#中的真实世界应用(即通过linq SelectMany(或其他),这显然比在oldskool C#中解决同类问题的其他方法有所改进。 / p>
有没有人见过这样的野兽?
答案 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 end的Brian Beckman's state-monad talk on Channel 9。
答案 7 :(得分:0)
I recently blogged关于将典型的命令式现实世界C#代码(NuGet中的函数)重构为功能性的monadic风格(更具体地说,使用 Maybe monad )。我尽力在很短的步骤内完成它,解释合理的步骤,所以我认为它有助于理解monad是如何有用的。