Eric的回答引用: Monads in C# -- why Bind implementations require passed function to return a monad?
"但是如果g返回一个monad并且f没有返回monad那么就没有f和g的组合 - 不能保证有一种方法可以从实例返回monad to a" unwrapped"类型"
这是否意味着如果g和f都返回monad 将保证这些是从monad实例返回到" unwrapped"类型?但怎么样?有人可以向我解释这一点吗?
更新:感谢Aaron和Euge的回答,现在我明白从M回来T不是Monad要求(API)的一部分,而是来自Monad内部绑定函数实现本身,它应该知道如何从uris=/users/\d+/calendars
获取T,否则,如何在绑定函数内调用M<T>
。
答案 0 :(得分:1)
不,这不是Monad的已定义属性之一。 Haskell page on Monads清楚地解释了您无法直接从a
获得M a
。引用解释说,一旦你从T
转到M<T>
,你总是需要使用M<T>
,因此Lifting的效用。
答案 1 :(得分:0)
正如亚伦已经说过,答案是肯定的。最简单的例子,看你不能总是&#34;回来&#34;在我看来,来自monad的是经常被称为Maybe
monad或Option
的情况。你可以在C#中看到一个实现:https://mikhail.io/2016/01/monads-explained-in-csharp/
我不太了解C#所以我会避免编写代码并尝试用文字解释它。
为了模拟可能失败的计算,我们可以使用一个数值类型,或者它不是任何东西(想想null
的替代方法)。该数据类型为monad的要求如下:
B
类型的东西,那么我们就可以得到一个返回Maybe<B>
的等效计算。
这是return
构造函数,它只是将值包装在Maybe
。考虑我们组合两个可能失败的函数的情况。我们能不能总是得到一个价值?好吧,并非总是如此。当两个函数都没有失败时,我们得到一个值。
我现在尝试用代码解释它。我错了,你可以纠正我。
所以我们假设我们可能有maybeValue
A
Maybe<A> maybeValue = ...;
我们的函数foo
采用A
类型的值。
Maybe<B> foo(A a) {...}
我们希望将maybeValue
传递给foo
。 Monads允许您在不检查maybeValue
的情况下执行此操作,以查看它是否具有值。哟这样做:
Maybe<B> result = maybeValue.bind(foo)
再次说明:我可以始终将result
转换为B
类型的内容吗?我的意思是,result
始终是否包含值?好吧,不。仅当maybeValue
和foo
都成功时。