最近简要介绍了Haskell,对于monad本质上是什么,简单,简洁,实用的解释是什么?
我发现我遇到的大多数解释都是相当难以接近的,缺乏实际细节.
就OOP程序员所理解的而言(没有任何函数编程背景),monad是什么?
它解决了什么问题,它使用的最常见的地方是什么?
编辑:
为了澄清我一直在寻找的理解,让我们假设您正在将具有monad的FP应用程序转换为OOP应用程序.你会怎么做把monad的职责移植到OOP应用程序?
可能重复:
什么是monad?
我想我明白'也许莫纳德'是什么,但我不确定其他类型.
我正在学习monads并且有一些问题.
这就是我现在所处的位置.请纠正我错在哪里.
该>>=标志为中缀运算符.中缀运算符是带有两个参数(左侧和右侧)并返回值的函数.
该>>=符号称为绑定运算符并具有签名Monad m => m t -> (t -> m u) -> m u.但是,这些类型似乎没有排在这里.我们得到一个类型的值,m t第二个参数是一个带有a的函数t.(我不知道如何连接点.)
这必定意味着绑定功能,在某种程度上能够去除m从m t为了得到t并把它传递给函数.
这是我的问题:
是否能够m从m t仅在此类绑定运算符内部执行的操作中删除.这个绑定运算符是否有一些特殊的特权?
它与状态变化有什么关系?我理解(我认为)monad的目标是"包装"副作用,以便它们与程序的其余部分隔离开来.但是绑定运算符在这方面的作用是什么?
public static Func<V> To<T, V>(this Func<T> g, Func<T, V> h)
{
return () => h(g());
}
public static Func<T> ToIdentity<T>(this T t)
{
return () => t;
}
Run Code Online (Sandbox Code Playgroud)
在延迟评估时,我有时会使用这些和其他人.这些已经在.net库中吗?
编辑:
以下是一个示例用法:
public static string SuffixColumn(this string v, string suffix, int columns)
{
return
v.ToIdentity()
.ToScrubbedHtml()
.ToFormat(() => "{0} " + suffix.ToLower().PadLeft(columns, ' '))
.ToErrorText(v, suffix, columns)();
}
Run Code Online (Sandbox Code Playgroud)
ToErrorText将'v'检查为合法(非错误代码,非null等),如果好,它运行链接在Func中,如果不好则生成故障安全文本结果.如果v,后缀或列不好,则永远不会调用ToFormat.(因此延迟/未评估的使用).
ToFormat几乎是提供的Func和string.Format的组合.ToIdentity用于将v提升为Func,然后链中的所有内容都基于T的一些Func.
在2015年,C#中可能有任何“官方”的monad吗?理想情况下,它将可以使用ala Scala的Option,Some和None类型。
C#似乎具有所需的所有内容,即co / contravariance和lambda。
我之所以这么问,是因为我最近开始在一家使用Unity的公司工作,并且遇到了很多延迟的初始化工作。为了避免NullPointerException,我想邀请他们进入monad世界。关于这一点有什么想法,还是我们应该简单地以其他方式处理?