5

我想编写一个函数saveStuff,在通过某些测试后将某些内容保存到文件中。如果测试失败,我需要提出一个错误。这个函数的结果类型应该是什么?我想到了IO (Either String ())and IO (Maybe String),但由于某种原因,他们俩都觉得不对劲。我从标准库中查找了类似的函数,但它们似乎只是返回IO (). 他们在失败时抛出异常。我找不到自己喜欢这种方法。

4

2 回答 2

7

您可以考虑编写一些返回ErrorT String IO (). ErrorTmonad 转换器的文档在 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 回答