2016-10-12 3 views
1

私の質問:ハスケルには "try with"同等のものがありますか?ハスケルでOcamlの「try ... with」

 
try 
{ 
head l 
} 
with 
Failure _ -> [] 

tryの操作が失敗した場合は、エラーとパターンが一致し、セクションで適切なジョブを実行しますか?

+0

[スプーン](http://hackage.haskell.org/package/spoon-0.3.1/docs/Control-Spoon.html)がありますが、これはマルチスレッド環境ではかなりハックして信頼性がありません。優先するべきことは、部分的な関数を避けることです。あるいは、関数を使用する場合は、最初に引数のサニティチェックを実行して、例外がスローされないことを確認します。 – leftaroundabout

答えて

2

ほとんどの場合、関数と合計関数を使用して同じことを達成できます。あなたの例:

fromMaybe [] (listToMaybe l)

+1

...またはこの場合は単に 'take 1'。 – leftaroundabout

3

あなたは本当に、全機能を介して、このようなエラーを回避する必要があります。関数がエラーを返すことができる場合は、戻り値の型を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 
+0

メッセージを表示したくない別の関数を実行したいので、この例を単純化するだけです。 – mhn70

+0

あなたは 'catch'に渡す関数の中でどんなこともできます...しかし、それがあなたがやっていることなら、本当に代わりに関数を使う必要があります。もう一つの答えを見てみましょう。 – Alec

0

をこのような単純なケースでは、あなただけのfoldr使用することができますMaybeまたはEitherは、他の人が示唆しているように、よりモジュラーなコードを作ることができます。エラーをモナディック計算に統合するには、MaybeTExceptTの型とMonadErrorの型をチェックするとよいでしょう。

関連する問題