サーチ…


オプションの種類

パラメータ化された型の良い例は、 Option型です。本質的に次のような定義です(型に定義されているいくつかのメソッドがあります)。

sealed abstract class Option[+A] {
  def isEmpty: Boolean
  def get: A

  final def fold[B](ifEmpty: => B)(f: A => B): B =
    if (isEmpty) ifEmpty else f(this.get)

  // lots of methods...
}

case class Some[A](value: A) extends Option[A] {
  def isEmpty = false
  def get = value
}

case object None extends Option[Nothing] {
  def isEmpty = true
  def get = throw new NoSuchElementException("None.get")
}

これには、 B型のものを返すパラメータ化されたメソッドfoldがあることもわかります。

パラメータ化されたメソッド

メソッドの戻り値のは、パラメーターのによって異なります。この例では、 xパラメータであり、 A一種であるx 型パラメータとして知られています、。

def f[A](x: A): A = x

f(1)         // 1
f("two")     // "two"
f[Float](3)  // 3.0F

Scalaは型推論を使用して戻り値の型を決定します。この型は、パラメータで呼び出されるメソッドを制限します。したがって、注意が必要です。 *はすべてのタイプAに対して定義されていないため、以下はコンパイル時エラーです。

def g[A](x: A): A = 2 * x  // Won't compile

ジェネリックコレクション

Intsのリストを定義する

trait IntList { ... }

class Cons(val head: Int, val tail: IntList) extends IntList { ... }

class Nil extends IntList { ... }

ブール、ダブルなどのリストを定義する必要がある場合はどうなりますか?

ジェネリックリストの定義

trait List[T] {
  def isEmpty: Boolean
  def head: T
  def tail: List[T]
}

class Cons[T](val head: [T], val tail: List[T]) extends List[T] {
  def isEmpty: Boolean = false
}

class Nil[T] extends List[T] {
  def isEmpty: Boolean = true

  def head: Nothing = throw NoSuchElementException("Nil.head")

  def tail: Nothing = throw NoSuchElementException("Nil.tail")
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow