我想編寫一個函數saveStuff
,它在文件通過某些測試後將其保存到文件中。如果測試失敗,我需要提出錯誤。這個函數的結果類型應該是什麼?我想到了IO (Either String())
和IO (Maybe String)
,但是他們兩個都覺得出於某種原因是錯誤的。我從標準庫中查找類似的功能,但他們似乎只是返回IO()
。他們拋出失敗的例外。我無法找到自己喜歡這種方法。這個函數的結果類型應該是什麼?
5
A
回答
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
相關問題
- 1. 這個函數的返回類型應該是什麼?
- 2. 這應該是什麼數據類型?
- 3. 什麼是參數的類型,這個函數做什麼?
- 4. dummy()函數 - 這應該是什麼?
- 5. 這個模擬測試的結果應該是什麼?
- 6. 這個本體的結果應該是什麼?
- 7. 什麼應該params,進度,這個AsyncTask的結果是
- 8. 這些類型轉換的結果是什麼?爲什麼?
- 9. 這個未聲明的變量應該是什麼類型?
- 10. 這個lambda表達式的返回類型應該是什麼?
- 11. 我應該傳遞這個JavaScript函數的參數是什麼?
- 12. 卷積的結果應該是什麼?
- 13. 這是什麼類型的聲明?一個函數?類?
- 14. 在這種情況下應該是什麼數據類型?
- 15. 傳遞到這個函數中的參數是什麼類型
- 16. 這種自適應因子函數的類型是什麼?
- 17. 應該是什麼類型的變量?
- 18. 這個函數的返回類型是什麼?
- 19. 這個Haskell函數的類型簽名是什麼?
- 20. 是什麼這2個函數的語法類型
- 21. 什麼是tableresource(9)類型(pgsql結果)
- 22. 什麼是類型和什麼是類型構造函數scala
- 23. 返回類型應該是什麼?
- 24. dt函數的結果是什麼?
- 25. readPNG函數的結果是什麼?
- 26. Perl:「validate」函數中類對象應該使用什麼類型
- 27. 導出類結果「類型錯誤:......是不是一個函數」
- 28. 類型錯誤的結果(這).simpledialog [未定義]是不是一個函數
- 29. datastax映射類中的timeuuid應該是什麼數據類型?
- 30. 這個XML應該是什麼模式?
如果它只能以一種方式成功,那麼'Maybe ErrorMessage'或類似的東西是正確的類型。如果你不喜歡'Maybe',因爲通常'Nothing'表示失敗,使用'數據Result = Success |失敗字符串「。 –
@DanielFischer:這可能是一個很好的答案(而不是評論)。 –