タグ

ブックマーク / modegramming.blogspot.com (4)

  • Scala Tips / flatMapとbind(>>=)の違い

    ScalaのflatMapメソッドは、モナドのbindに対応するメソッドとして認識されています。つまり、基的にはScalazの>>=メソッドと同じ動作をするわけですが、微妙な機能差があります。 以下はListに対してflatMapメソッドを用いてモナドのbind処理を行ったものです。 scala> List(1, 2, 3).flatMap(x => if (x % 2 == 0) List(x, x) else Nil) res16: List[Int] = List(2, 2)これはScalazの>>=メソッドも全く同じ動作をします。 scala> List(1, 2, 3) >>= (x => if (x % 2 == 0) List(x, x) else Nil) res17: List[Int] = List(2, 2) 次の例さて、今度の例はListのコンテナに対してOpti

    gomi_ningen
    gomi_ningen 2015/04/10
    “flatMapはGenTraversableOnceのCanBuildFrom型クラスのインスタンスを要求するようになっているので、最終的な結果型は保存されます” なるほど
  • Scala Tips / Either (4) - getOrElse, flatMap

  • Scala Tips / Scala 2.10味見(10) - Try(2)

    TryとEitherは2つの状態による計算文脈を表現するという意味ではよく似たオブジェクトですが、Tryはファンクタ(Functor)かつモナド(Monad)であるのに対してEitherはそうではないという点が異なります。 Eitherは直和の性質を表現するために2つの状態を同じ比重で扱いますが、この点を徹底するためにファンクタやモナドにはしていないと思われます。EitherではLeftProjectionやRightProjectionと組み合わせることによって、ファンクタ的、モナド的な使い方も可能ですが使い勝手がよいとはいえません。 正常状態と異常状態の2つの状態を扱う場合、(1)出現頻度は正常状態の方が多い、(2)正常状態に対するロジックは複雑/異常状態に対するロジックは単純、(3)一度異常状態になると以降は異常状態を保持、となるケースが多いと思います。このようなケースでは、正常状態

  • Scala Tips / Either

    大枠ではB→Cの演算を行いたいわけですが、これをEither[A, B→C]の文脈の上で行うわけです。 以下で左側(失敗側)にException、右側(成功側)にIntを持つをEither、つまりEither[Exception, Int]をEither[Exception, String]に変換するプログラムを考えます。 (分類の基準) Java風if式でEither#isRightメソッドを使ってLeftとRightの判定をして、処理を切り分ける事ができます。 def f(a: Either[Exception, Int]): Either[Exception, String] = { if (a.isRight) { Right(a.right.get.toString) } else { a.asInstanceOf[Either[Exception, String]] } } S

  • 1