就OOP程序员所理解的而言(没有任何函数编程背景),monad是什么?
它解决了什么问题,它使用的最常见的地方是什么?
编辑:
为了澄清我一直在寻找的理解,让我们假设您正在将具有monad的FP应用程序转换为OOP应用程序.你会怎么做把monad的职责移植到OOP应用程序?
这些天有很多关于单子的讨论.我已经阅读了一些文章/博客文章,但我不能用他们的例子来完全掌握这个概念.原因是monad是一个函数式语言概念,因此这些例子都是我没有使用过的语言(因为我没有深入使用过函数式语言).我无法深入掌握语法以完全遵循这些文章......但我可以告诉它有一些值得理解的东西.
但是,我非常了解C#,包括lambda表达式和其他功能特性.我知道C#只有一部分功能特性,所以monad不能用C#表示.
但是,肯定有可能传达这个概念吗?至少我希望如此.也许您可以将C#示例作为基础,然后描述C#开发人员希望他可以从那里做什么,但不能,因为该语言缺乏函数式编程功能.这太棒了,因为它会传达monad的意图和好处.所以这就是我的问题:你可以给一个C#3开发人员提供monad的最佳解释是什么?
谢谢!
(编辑:顺便说一下,我知道SO上至少有3个"什么是monad"问题.然而,我遇到了同样的问题......所以这个问题需要imo,因为C#-developer焦点.谢谢.)
...与所有那些新的(如果我们计算IEnumerable不是那么新)与monad相关的东西?
interface IMonad<T>
{
SelectMany/Bind();
Return/Unit();
}
Run Code Online (Sandbox Code Playgroud)
这将允许编写以任何monadic类型操作的函数.或者它不是那么重要?
我在C#中看到的monad的大多数例子都是这样编写的:
public static Identity<B> Bind<A, B>(this Identity<A> a, Func<A, Identity<B>> func) {
return func(a.Value);
}
Run Code Online (Sandbox Code Playgroud)
例如,请参阅http://mikehadlow.blogspot.com/2011/01/monads-in-c-3-creating-our-first-monad.html.
问题是,要求func退货的重点是Identity<B>什么?如果我使用以下定义:
public interface IValue<A> {
public IValue<B> Bind<B>(Func<A, B> func)
}
Run Code Online (Sandbox Code Playgroud)
那么我可以实际使用的同func为Lazy<T>,Task<T>,Maybe<T>等没有实际根据实际类型实现IValue.
我在这里缺少什么重要的东西?