1

私は抽出器を使用するために練習しています:

scala> object LE {
     | def unapply[A](theList: List[A]) = 
     | if (theList.size == 0) None
     | else Some((theList.head, theList.tail))
     | }
defined module LE

1 つの要素に一致する場合に機能します。

scala> List(0, 1, 2) match {
     | case head LE more => println(head, more)
     | }
(0,List(1, 2))

しかし、複数の要素に一致する場合は機能しないようです:

scala> List(0, 1, 2) match {
     | case head LE next LE more => println(head, more)
     | }
<console>:10: error: scrutinee is incompatible with pattern type;
 found   : List[A]
 required: Int

私のリスト エクストラクタは、Scala の Stream エクストラクタに非常によく似ており、次のように使用できます。

val xs = 58 #:: 43 #:: 93 #:: Stream.empty
xs match {
  case first #:: second #:: _ => first - second
  case _ => -1
}

では、私の LE がそのような方法で使用されないようにする違いは何でしょうか?

4

1 に答える 1

3

問題は実行順序です。の場合#::、それは で終わるため:、Scala はそれを特別に扱い、左から右ではなく右から左に関連付けます ( your などの他の演算子/型では通常のことですLE)。以下は期待どおりに機能します。

scala> List(0, 1, 2) match {
     | case head LE (next LE more) => println(head, more)
     | }
(0,List(2))
于 2013-08-19T00:37:13.270 に答える