引用埃里克的回答:C#中的monad --为什么绑定实现需要传递函数才能返回monad?
但是,如果g返回一个monad,而f不返回这个monad,那么就不存在f和g的组合--不能保证从monad的实例返回到“解包装”类型。
这是否意味着,如果g和f都返回monad ,那么monad 将保证这些方法可以从这个实例返回到一个“未包装的”类型。但是怎么做呢?有人能向我解释一下这一点吗?
更新:感谢和的回答,现在我知道从M获取T不是Monad的要求(API)的一部分,而是从Monad绑定函数实现本身,它应该知道如何从M<T>
获取T,否则,如何在绑定函数中调用Func<T, M<R>>
。
发布于 2018-01-05 11:40:21
不,这不是Monad定义的属性之一。Haskell Monad页面清楚地解释说,您不能直接从M a
中获取一个a
。引语是,一旦您从T
转到了M<T>
,您总是需要使用M<T>
,因此使用了起重。
发布于 2018-01-05 14:04:11
正如亚伦已经说过的,答案是否定的。在我看来,最简单的例子就是经常被称为Maybe
monad或Option
的例子,您不能总是从单曲中“回来”。您可以在这里看到C#中的实现:https://mikhail.io/2016/01/monads-explained-in-csharp/
我不太了解C#,所以我将避免编写代码,并尝试用文字来解释它。
要对可能失败的计算进行建模,我们可以使用一个数据类型,它要么是值,要么是空值(想想null
的替代方案)。要求该数据类型为单一类型的要求如下:
B
类型的东西,那么我们就可以得到一个返回Maybe<B>
的等量计算。这是return
构造函数,它简单地将值包装在Maybe
中。考虑一下我们组成两个可能会失败的函数的情况。我们总能得到价值吗?嗯,不总是这样。当这两个函数都没有失败时,我们得到一个值。
我现在试着用代码来解释它。当我错的时候你可以纠正我。因此,假设我们有一个maybeValue
类型的A
值
Maybe<A> maybeValue = ...;
我们有一个函数foo
,它接受A
类型的值。
Maybe<B> foo(A a) {...}
我们想把maybeValue
传给foo
。Monad允许您这样做,而无需检查maybeValue
是否有值。你这样做吧:
Maybe<B> result = maybeValue.bind(foo)
再说一遍:我可以总是把result
转换成B
类型的东西吗?我是说,result
总是包含一个值吗?嗯,不是。只有当maybeValue
和foo
都成功的时候。
https://stackoverflow.com/questions/48120024
复制