5

saveStuff特定のテストに合格した後、ファイルに何かを保存する関数を作成したいと思います。テストが失敗した場合、エラーを発生させる必要があります。この関数の結果タイプはどうあるべきですか?IO (Either String ())とを思いついたのですが、どういうわけかIO (Maybe String)どちらも違和感があります。標準ライブラリから同様の関数を検索しましたが、単に。を返す​​ようですIO ()。それらは失敗時に例外をスローします。私はそのアプローチが好きだとは思いません。

4

2 に答える 2

7

を返すものを書くことを検討できますErrorT String IO ()ErrorTモナド変換子のドキュメントはHackageにあります。エリック・キッドによるエラーを報告するための優れた8つの方法と、数年後のエドワード・ヤンによるフォローアップには、さらに多くの提案があります。

于 2012-05-05T01:38:10.537 に答える
6

成功できる方法が1つしかない場合は、saveStuff同型の型Maybe ErrorMessageが正しい型です。それ自体には、通常使用時に失敗を示すMaybe ErrorMessageという欠点があるため、ここでの期待に反することになります。それに関しては、より良いですが、ケースのパラメータには情報が含まれていないため、そのオプションにも優雅さが欠けています。NothingMaybeEither ErrorMessage ()()Right

これらの欠点を受け入れたくない場合は、独自の結果タイプを定義してください

data Result = Success | Failure ErrorMessage
-- with type ErrorMessage = String, for example
于 2012-05-05T00:49:42.390 に答える