私の質問:ハスケルには "try with"同等のものがありますか?ハスケルでOcamlの「try ... with」
try { head l } with Failure _ -> []
tryの操作が失敗した場合は、エラーとパターンが一致し、セクションで適切なジョブを実行しますか?
私の質問:ハスケルには "try with"同等のものがありますか?ハスケルでOcamlの「try ... with」
try { head l } with Failure _ -> []
tryの操作が失敗した場合は、エラーとパターンが一致し、セクションで適切なジョブを実行しますか?
ほとんどの場合、関数と合計関数を使用して同じことを達成できます。あなたの例:
fromMaybe [] (listToMaybe l)
...またはこの場合は単に 'take 1'。 – leftaroundabout
あなたは本当に、全機能を介して、このようなエラーを回避する必要があります。関数がエラーを返すことができる場合は、戻り値の型をEither e a
にします。ここで、e
は例外の型で、a
は正常に型です。例外に関する情報を渡す必要がない場合は、Maybe a
を返すことができます。 Control.Exception
だけIO
モナドで、このような処理を行うことができるというコストで、try
またはcatch
を経由してエラーをキャッチするためのいくつかの施設を持っている、と述べた
。 GHCiのではあなたがこれを見ることができます:、
case l of
[] -> []
x : _ -> x
をより一般的に使用:直接パターンマッチングを使用しても
foldr const [] l
をまたは:
ghci> import Control.Exception
ghci> catch (head []) (\msg -> putStrLn $ "caught: " ++ show (msg :: SomeException))
caught: Prelude.head: empty list
をこのような単純なケースでは、あなただけのfoldr
使用することができますMaybe
またはEither
は、他の人が示唆しているように、よりモジュラーなコードを作ることができます。エラーをモナディック計算に統合するには、MaybeT
とExceptT
の型とMonadError
の型をチェックするとよいでしょう。
[スプーン](http://hackage.haskell.org/package/spoon-0.3.1/docs/Control-Spoon.html)がありますが、これはマルチスレッド環境ではかなりハックして信頼性がありません。優先するべきことは、部分的な関数を避けることです。あるいは、関数を使用する場合は、最初に引数のサニティチェックを実行して、例外がスローされないことを確認します。 – leftaroundabout