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
没什么不同。