2012-05-04 7 views
5

特定のテストに合格した後、ファイルに何かを保存する関数saveStuffを書きたいと思います。テストが失敗した場合は、エラーを発生させる必要があります。この関数の結果の型はどうでしょうか?私はIO (Either String())IO (Maybe String)と考えましたが、どちらもと感じるのは何らかの理由でです。私は標準ライブラリから同様の機能を探しましたが、単にIO()を返すようです。彼らは失敗時に例外を投げます。私はそのアプローチが好きであるとは思っていません。この関数の結果の型はどうでしょうか?

+7

成功することができれば、「多分ErrorMessage」か同型のものが正しいタイプです。通常は 'Nothing'が失敗を示しているので、' Maybe'が気に入らなければ 'data Result = Success |失敗文字列 '。 –

+2

@DanielFischer:これはおそらく答え(コメントではない)としては良いでしょう。 –

答えて

7

を定義します。 ErrorTモナドトランスのドキュメントはon Hackageです。数年後にEdward YangによってEric Kiddとfollow upによって優れたEight Ways to Report Errorsにさらに提案があります。

+0

'ErrorT'も私が考えたものです。あなたは本質的に 'IO()'を持っており、エラーの可能性をメッセージに追加したいので、 'ErrorT'トランスをその上に置いてください。 –

6

saveStuffが成功できる唯一の方法がある場合は、Maybe ErrorMessageと同型のタイプが正しいタイプです。 Maybe ErrorMessage自体には、Maybeを使用したときに通常Nothingが失敗を示すという欠点があります。そのため、ここでは期待に反するでしょう。それに関しては、Either ErrorMessage()が良いですが、の場合は()のパラメータには情報が含まれていないため、そのオプションもエレガントではありません。あなたはこれらの欠点を受け入れたくない場合は

、あなたがErrorT String IO()返す何かを書いて検討することもでき、独自の結果の型

data Result = Success | Failure ErrorMessage 
-- with type ErrorMessage = String, for example 
関連する問題