Functional Programming in C++在10.5.2节中显示了expected<T,E> monad,它与Haskell的Either相同。
到现在为止还挺好。
然后,在10.5.3节中,它声称显示“尝试”单子(monad),或者至少这是该节的标题。
在此“monad”中,仅显示一个函数,而不是mbind,它被称为mtry,并且它接受的输入不是要包装在“try monad”中的值,而是一种函数,该函数在运行时可以返回值或引发异常,然后将每个异常适当包装在expected monad中。
因此,如果我误解了作者的观点(除我之外,大多数读者都明白这一点),或者我的标题确实令人误解,那我就在徘徊。

最佳答案

本书中的mtry函数基本上是一种构造expected monad的有用方法,其中一侧的类型始终是一个异常(exception)。
其他诸如Scala之类的语言具有单独的Try[A]类型,其中所有的monady东西都被复制而不是构造Either,但是有些方法专门为方便使用而设计,因为您知道自己正在处理异常,例如是否在其异常中抛出异常。 map它将重新捕获在Try中,而不是传播它。这是包装命令式异常代码并将抛出的异常转换为值的好方法。
我想,如果您了解Scala的Try,那么本书的这一部分会更有意义。作者并不是真正地向您展示如何制作整个独立的Try,只是向您展示该概念如何映射回前面的部分。他基本上省略了mbind,因为它与expected没什么不同。

10-08 13:42
查看更多