Monad变压器非常棘手,我不确定(直觉不好)应该优先使用哪一个。

最佳答案

StateT s (ExceptT e m)

这说:
  • m开头
  • 向该
  • 添加例外
  • 将状态添加到该

  • 现在,“添加异常”意味着您的操作可以通过两种方式终止:具有正常的返回值或异常。

    “添加状态”意味着正常返回值中会包含额外的状态输出。

    因此,在StateT s (ExceptT e m)中,只有在没有异常的情况下您才能获得结果状态。

    另一方面,
    ExceptT e (StateT s m)
    

    说:
  • m开头
  • 将状态添加到该
  • 向该
  • 添加例外

    “添加状态”意味着m的返回值中包含了额外的状态输出。

    但是现在,您添加的例外被添加为StateT monad中的替代返回值。因此,您总是会得到一个状态输出,然后您可能会得到一个正常的返回值,或者您可能会收到一个异常。

    10-06 02:45