21

让我先声明一下,我对 Monad 的理解还很幼稚。我在这里阅读了有关 Monads 的各种主题,并对这个概念进行了几个小时的研究。我对这个词几乎感觉不舒服,但我认为可以肯定地说我通常理解 Monad 是/做什么。

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

有人见过这样的野兽吗?

4

8 回答 8

11

这是一个这样的场景:您想要创建一个解析库(嵌入式 DSL 的一个很好的示例),并且您发现最好的解析器库是单子解析器组合器库。因此,您编写它利用 LINQ 语法糖来编写与您正在解析的语言的语法具有相同结构的 C# 代码,并且您将获得用于动态语义分析和错误恢复的出色编程模型的好处. 有关说明,请参阅此博客

于 2009-05-15T05:25:55.987 回答
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 };
于 2010-01-24T21:18:48.827 回答
4

这是一种这样的场景:您想编写在不占用线程的情况下进行顺序异步调用(例如 IO)的代码,但您不想编写异步编程模型(BeginFoo/EndFoo)强迫您陷入的无望的意大利面条纠结. 因此,您可以使用 monad 和 LINQ 糖并编写看起来直线但它在整个过程中释放/切换线程的代码。有关简短说明,请参阅此博客

于 2009-05-15T05:22:20.707 回答
3

查看http://memoirsofaprogrammer.blogspot.com

于 2009-05-16T00:47:54.587 回答
3

null一个示例是使用 Maybe monad简化检查,如本文所示。

于 2011-10-24T22:20:26.950 回答
0

LINQ 用于 StackOverflow 上的许多解决方案(并且经常在问题中提出要求)。查看带有LINQ标记的问题,您将看到实际使用情况。

于 2009-05-15T09:35:19.477 回答
0

使用 monad 进行编程是声明性的,它从高层次描述你想要什么,而不是如何生成它的低层次细节。

请参阅第 9 频道 Brian Beckman 的 state-monad 演讲结尾处的练习

于 2009-07-15T14:58:47.860 回答
0

我最近写了一篇关于将典型的命令式现实世界 C# 代码(NuGet中的函数)重构为函数式、单子样式(更具体地说,使用Maybe monad)的博客。我尽我最大的努力一步一步来,解释背后的理性步骤,所以我认为它有助于理解 monads 是如何有用的。

于 2011-04-25T17:09:37.980 回答