RIO-Prelude中的guard
函数是否提供了任何方法来决定消息的内容,如果它失败了Either
-Monad?使得例如
somefun :: Either String Int
somefun = do guard (4+2 == 8); return 2
将返回Left someContent
,其中someContent
是以某种方式指定给guard
的字符串。
根据文档,我还没有找到任何方法,但是如果它存在的话,我很乐意知道它,因为guard
可能是避免嵌套if
-语句的好方法。
2条答案
按热度按时间d8tt03nd1#
这听起来更像是
when
或unless
的工作:实际上我更愿意写
when (4+2 /= 8) $ Left somecontent
。t30tvxxf2#
如果条件失败,
guard
将与empty
一起工作,所以不。您应该使用fail
,从而创建一些允许添加失败消息的guard
。因此,您可以使用:
所以你失败了:
实际上,我很惊讶地发现
Either String
不是MonadFail
的示例(感谢@JosephSible注意到这一点)。