我想编写一个函数saveStuff
,在通过某些测试之后将其保存到文件中。如果测试失败,我需要引发错误。这个函数的结果类型应该是什么?我想到了IO (Either String ())
和IO (Maybe String)
,但由于某些原因,他们两个感觉错了。我从标准库中查找了类似的函数,但它们似乎只是返回IO ()
。他们在失败时抛出异常。我发现自己并不喜欢这种方法。
答案 0 :(得分:7)
你可以考虑写一些返回ErrorT String IO ()
的东西。 ErrorT
monad转换器的文档是on Hackage。 Eric Kidd和Eight Ways to Report Errors在优秀的follow up中有更多的建议,多年后由Edward Yang提出。
答案 1 :(得分:6)
如果只有一种方式saveStuff
可以成功,那么与Maybe ErrorMessage
同构的类型就是正确的类型。 Maybe ErrorMessage
本身有一个缺点,通常Nothing
表示使用Maybe
时失败,所以它会违背期望。关于这一点,Either ErrorMessage ()
更好,但()
案例的Right
参数不包含任何信息,因此该选项也缺乏优雅。
如果您不想接受这些缺点,请定义您自己的结果类型
data Result = Success | Failure ErrorMessage
-- with type ErrorMessage = String, for example