我想编写一个函数saveStuff
,在通过某些测试后将某些内容保存到文件中。如果测试失败,我需要提出一个错误。这个函数的结果类型应该是什么?我想到了IO (Either String ())
and IO (Maybe String)
,但由于某种原因,他们俩都觉得不对劲。我从标准库中查找了类似的函数,但它们似乎只是返回IO ()
. 他们在失败时抛出异常。我找不到自己喜欢这种方法。
问问题
150 次
2 回答
7
您可以考虑编写一些返回ErrorT String IO ()
. ErrorT
monad 转换器的文档在 Hackage 上。在Eric Kidd的优秀报告错误的八种方法和几年后 Edward Yang的后续行动中,有更多的建议。
于 2012-05-05T01:38:10.537 回答
6
如果只有一种方法saveStuff
可以成功,那么同构的类型Maybe ErrorMessage
就是正确的类型。Maybe ErrorMessage
它本身有一个缺点,通常Nothing
在使用时表示失败Maybe
,因此在这里会与预期背道而驰。就这一点而言,Either ErrorMessage ()
更好,但案例的()
参数Right
不携带任何信息,因此该选项也缺乏优雅。
如果您不想接受这些缺点,请定义自己的结果类型
data Result = Success | Failure ErrorMessage
-- with type ErrorMessage = String, for example
于 2012-05-05T00:49:42.390 回答