中置演算子のScala一致分解
-
06-07-2019 - |
質問
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)
もご覧ください。所属していません StackOverflow