10

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

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

一致式はどのようにではx :: xsなく許可されますList(x, xs)か?

4

3 に答える 3

13

Jay Conrad の答えはほぼ正しいです。重要なことは、メソッドを実装し、type を返すという名前のオブジェクトがどこかにあるということです。したがって:::unapplyOption[(A, List[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ただし、上記の例が示すように、ケース クラスである必要はまったくありません。

于 2009-06-20T20:48:15.807 に答える
7

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

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

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

a match {
  case x %%% y => x + y
}
于 2009-06-20T18:52:27.693 に答える
4

List(x, xs) ではなく x :: xs の一致式を使用するにはどうすればよいですか?

この質問に答えるには:

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

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

scala ケースクラスの質問も参照してください

于 2010-12-19T21:43:23.370 に答える