エラー処理によるコードの分岐を減らしたい場合、Eitherを使うとよい。 Eitherの使い方 Either[A, B] は、AまたはBを返す型である。 Eitherは通常Either[(エラー情報), (結果)]の形で使われる。例えばデータ処理が成功した場合はその結果を用いて引き続きの処理を行いたいが、エラーの場合は何もせず次のコードにエラーだけを伝えたい場合がある。 Eitherから値を取り出すには、left, rightの値に対してmap, flatMapなどを用いる。例えば、Either.right map { ... }とすると、値の内容がRight型の場合はmap内の関数を適用し、Leftの型の場合はmapの処理を無視してLeftの内容(この場合はエラー情報を)をそのまま返す。 具体例 # 文字列がIntに変換できるならIntを、失敗した場合はExceptionを返す関数 sc
今日はScalaの例外処理について解説しますよ。 基本 - try,catch,finally 例外処理の基本は、try,catch,finallyです。これはJavaと同じですね。 ただし、Scalaでのtry,catch,finallyは値を生成します。つまり、実行されたブロックの値が評価されます。 scala> val n = try{ "99".toInt } catch { case e:Exception => -99 } n: Int = 99 scala> val n = try{ "foo".toInt } catch { case e:Exception => -99 } n: Int = -99 上記のように、catch節には "case e:Exception => ..."のようなパターンマッチを書くことで、対応する例外の型に応じて補足することができます。try,
前回までのエントリーはこちら BDD on Haskell の為のディレクトリ構成を考える BDD on Haskell チュートリアル その0 Haskell の浮動小数点小数の同値比較について BDD on Haskell チュートリアル その1 : HUnit で TDD を BDD on Haskell チュートリアル その2 : QuickCheck でランダムテスト BDD on Haskell チュートリアル その3-1 catch できない哀しみ BDD on Haskell チュートリアル その3-2 throw Exception を使わず基本は Either を使おう 今回のテーマ - 「テスト済みのモジュールの仕様変更」前回書いたように,IO が絡まないはずの関数群に Exception を throw させるよりは Either <Error> <Success>
前回の続き.前回までのエントリーはこちら BDD on Haskell の為のディレクトリ構成を考える BDD on Haskell チュートリアル その0 Haskell の浮動小数点小数の同値比較について BDD on Haskell チュートリアル その1 : HUnit で TDD を BDD on Haskell チュートリアル その2 : QuickCheck でランダムテスト BDD on Haskell チュートリアル その3-1 : catch できない哀しみ 「どちらか」を表現する Either 型Control.Exception の try catch finally はそもそも IO モナドで利用される事を想定している.つまり 外部からの入力や Haskell の実行結果を出力する境界で発生する予期しない事態に対応する為のものだ. なので,IO に本当は依存してな
動機: boost::optionalだけじゃなくboost::eitherがほしい - Faith and Brave - C++で遊ぼう Boost.Optional は C++ でも屈指の便利ライブラリですが、 「戻り値として使う」場合には、時々「失敗した」という状況の他に、失敗した状況を示すような値が返せると嬉しい場合があります。 つまり、関数本来の戻り値の代わりに、それとは別の型でエラー情報を返すことも出来る、 要するに Haskell で言うところの Either a b があるといい、ということです。 これを C++ で実現するためには、一見して Boost の Variant を使うことで boost::variant<string, double> sqrt_either( double x ) { if( x < 0 ){ return "negative number
boost::optionalは成功か失敗かしかわからないので 失敗した理由付きのoptionalがほしいよね、という話がTwitterでありました。 Maybeモナド(boost::optional)に対するEitherモナドのように boost::eitherという名前だと仮定して、こんな感じで使えるといいんじゃないかな、と。 either<int> foo(int a) { typedef either<int> result_type; return a >= 0 ? a : result_type("invalid argument", result_type::error_tag()); } either<int> x = foo(-1); if (!x) cout << x.what() << endl; cout << x.get() << endl; エラーがネストしてた
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く