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

mis*_*tor 5 haskell types functional-programming

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

Dan*_*ner 7

你可以考虑写一些返回的东西ErrorT String IO ().ErrorTmonad变换器的文档在Hackage上.在Eric Kidd 报告错误八种方法中有更多的建议,并在几年后由Edward Yang 跟进.


Dan*_*her 6

如果只有一种方法saveStuff可以成功,那么同Maybe ErrorMessage形的类型就是正确的类型.Maybe ErrorMessage本身有一个缺点,通常Nothing表示使用时失败Maybe,所以它会与这里的期望背道而驰.关于这一点,Either ErrorMessage ()更好,但案例的()参数Right不带任何信息,因此该选项也缺乏优雅.

如果您不想接受这些缺点,请定义自己的结果类型

data Result = Success | Failure ErrorMessage
-- with type ErrorMessage = String, for example
Run Code Online (Sandbox Code Playgroud)