就OOP程序员所理解的而言(没有任何函数编程背景),monad是什么?
它解决了什么问题,它使用的最常见的地方是什么?
编辑:
为了澄清我一直在寻找的理解,让我们假设您正在将具有monad的FP应用程序转换为OOP应用程序.你会怎么做把monad的职责移植到OOP应用程序?
在上一个问题中,我问为什么不能用Java声明Monad接口?。在那里,我得到的评价从作者Brian Goetz说,我应该叫“高阶类型”,“高kinded类型”。
现在,我阅读了有关类型系统的更多信息,并且了解了更高种类的类型的概念。但是,我仍然对这些术语感到困惑。我试图使用Google自己消除它们的歧义,但是似乎没有一个明确的答案。因此,我的问题是以下术语的确切含义是什么:
这三个术语都存在吗?它们之间有区别吗?有什么不同?编程语言之间的含义是否有所不同?
我还注意到StackOverflow有多个标签:
但是,两者都没有标签Wiki。
阅读Previous SO Question我很困惑地发现Eric Lippert说不能在 C# 中为所有 Monad 定义接口,使用如下实现:
typeInterface Monad<MonadType<A>>
{
static MonadType<A> Return(A a);
static MonadType<B> Bind<B>(MonadType<A> x, Func<A, MonadType<B>> f);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是问题中列出的所有问题似乎都有简单的解决方案:
Monad 是一种模式,允许对包装类型的操作进行链接 为所有 Monad 定义一个 C# 接口似乎很容易,允许我们为所有 monad 编写一个通用类 问题出在哪里?
using System;
using System.Linq;
public class Program
{
public static void Main()
{//it works, where's the problem?
new SequenceMonad<int>(5)
.Bind(x => new SequenceMonad<float>(x + 7F))
.Bind(x => new SequenceMonad<double>(x + 5D))
;
}
interface IMonad<T>{
IMonad<T> Wrap(T a); …Run Code Online (Sandbox Code Playgroud)