質問

Scalaでの List の実装を理解しようとしています。特に、次の例のように、中置演算子を使用して一致式を作成する方法を理解しようとしています。

a match {
  case Nil => "An empty list"
  case x :: Nil => "A list without a tail"
  case x :: xs => "A list with a tail"
}

List(x、xs)ではなく、 x :: xs に一致式を許可する方法は?

役に立ちましたか?

解決

ジェイコンラッドの答えはほぼ正しいです。重要なことは、 unapply メソッドを実装する :: という名前のオブジェクトがどこかにあり、 Option [(A、リスト[A])] 。したがって:

object :: {
  def unapply[A](ls: List[A]): Option[(A, A)] = {
    if (ls.empty) None
    else Some((ls.head, ls.tail))
  }
}

// case objects get unapply for free
case object Nil extends List[Nothing]

:: および List の場合、このオブジェクトは :: がケースクラスであるという事実から発生します List 特性を拡張します。ただし、上記の例が示すように、ケースクラスになることはまったくありません。

他のヒント

::は実際にはクラスであると考えています(Listのサブクラスです)、 x :: xs と言うことは、ほとんど List(x、xs)と同等です。

これは、演算子名を持つ他のケースクラスで実行できます。例えば:

case class %%%(x: Int, y: Int)

a match {
  case x %%% y => x + y
}
  

どのように一致式はList(x、xs)ではなくx :: xsになりますか?

この質問に答えるには:

  

パターンとして見た場合、中置    p op q などの操作は同等です    op(p、q)へ。つまり、中置   演算子opは   コンストラクターパターン

(Scalaでのプログラミング、第1版、p。331)

スカラケースクラスの質問

もご覧ください。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top