这个函数的结果类型应该是什么?

时间:2012-05-04 22:27:43

标签: haskell types functional-programming

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

2 个答案:

答案 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