2012-05-04 68 views
5

我想編寫一個函數saveStuff,它在文件通過某些測試後將其保存到文件中。如果測試失敗,我需要提出錯誤。這個函數的結果類型應該是什麼?我想到了IO (Either String())IO (Maybe String),但是他們兩個都覺得出於某種原因是錯誤的。我從標準庫中查找類似的功能,但他們似乎只是返回IO()。他們拋出失敗的例外。我無法找到自己喜歡這種方法。這個函數的結果類型應該是什麼?

+7

如果它只能以一種方式成功,那麼'Maybe ErrorMessage'或類似的東西是正確的類型。如果你不喜歡'Maybe',因爲通常'Nothing'表示失敗,使用'數據Result = Success |失敗字符串「。 –

+2

@DanielFischer:這可能是一個很好的答案(而不是評論)。 –

回答

7

你可以考慮寫東西,返回ErrorT String IO()ErrorT monad變壓器的文檔是on Hackage。 Eric Kidd在優秀的Eight Ways to Report Errors和Edward Yang的多年後提出的follow up中有更多的建議。

+0

'ErrorT'也是我想到的。你本質上是一個'IO()',並且你想用一條消息添加一個錯誤的可能性,所以只需要把'ErrorT'變形器放在它的頂部。 –

6

如果只有一種方法saveStuff可以成功,則類型與Maybe ErrorMessage同構的類型是正確的類型。 Maybe ErrorMessage本身有缺點,通常Nothing表示使用Maybe時出現故障,所以它會與此處的預期背道而馳。對此,Either ErrorMessage()比較好,但Right()參數不帶任何信息,因此該選項也不夠優雅。

如果你不想接受這些缺點,定義自己的結果類型

data Result = Success | Failure ErrorMessage 
-- with type ErrorMessage = String, for example 
相關問題