タグ

ブックマーク / xerial.org (3)

  • Type Class - アルゴリズムとデータの鎹(かすがい) | Scala Cookbook

    Type Class(型クラス) とは型の性質を表現するためのクラスで、Haskellなどの関数型言語では古くから使われています。型クラスは、アルゴリズムとアルゴリズム中で使うデータ型の結合を緩やかにする、あるいは、アルゴリズム中で使うデータと実際のデータ型の型合わせをするために使われます。 例題 例えば、区間データ(start, end)を保持するためのIntervalHolderを考えてみます。区間を保持するという意味では汎用的に書けそうなので、区間をAとしてGenericなクラスとして表現します。 class IntervalHolder[A] { private var holder = Map[Int, A]() def +=(e:A) { holder += e.start -> e // コンパイルエラー。Aはstartを持つ型ではない } } Aにはstartというパラメー

  • Eitherによるエラー処理 - エラー処理による分岐を減らす | Scala Cookbook

    エラー処理によるコードの分岐を減らしたい場合、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のEnumerationは使うな - Scalaで列挙型を定義するには | Scala Cookbook

    ScalaのEnumerationは使うな Scalaで列挙型を定義するには AntiPattern Published 29 June 2012 ScalaのEnumerationは使いにくい Scalaには列挙型としてEnumerationが用意されているが、以下の理由で使いにくい。 値にメソッドを定義できない DNAというEnumerationを定義しても、個々の値は、DNA.Value型として扱わなければならないため、コードが不自然になる。 Enumerationを使ったコード例 object DNA extends Enumeration { val A, C, G, T, N = Value } val base : DNA.Value = DNA.A また、DNA.Value型を拡張することが許されていないので、ラベルとしての機能しか持たせることができない。 解決策 Sca

  • 1