パターンマッチングは入力を受け取り、unapply
関数で分解します。したがって、あなたの場合、unapply(4)
は、合計4の2つの数値を返さなければなりません。しかし、4に合計するペアがたくさんあるので、関数は何をすべきか分からないでしょう。
2
は何とかunapply
機能にアクセスできる必要があります。 2
を保存する特殊なケースクラスは、このために働くだろう:
case class Sum(addto: Int) {
def unapply(i: Int) = Some(i - addto)
}
val Sum2 = Sum(2)
val Sum2(x) = 5 // x = 3
を(コンパクトのためval Sum(2)(y) = 5
ような何かを行うことができるようにいいだろうが、Scalaはパラメータ化された抽出を許可していません。hereを参照してください。)
[EDIT:これは少し愚かですが、実際にはあまりにも次の操作を行うことができます:
val `2 +` = Sum(2)
val `2 +`(y) = 5 // y = 3
]
編集:理由は、head::tail
の作品は、リストの末尾から頭を分割する正確に1つの方法があるということです。
+
対::
について本質的に特別なものは何もありません:あなたはそれが数を破るたかったかの所定の考えを持っていた場合は、+
を使用することができます。たとえば、あなたは、あなたが何かを行うことができ、「半分に分割」を意味する+
を望んだ場合:
object + {
def unapply(i: Int) = Some(i-i/2, i/2)
}
をし、それが好きで使用します。
scala> val a + b = 4
a: Int = 2
b: Int = 2
scala> val c + d = 5
c: Int = 3
d: Int = 2
はEDIT:最後に、thisは、その説明パターンマッチングA op B
は、op(A,B)
と同じことを意味し、構文が見栄えが良くなります。 case head :: tail
とマッチング
出典
2011-07-18 20:01:49
dhg
「y-2」(y = 4の場合)を使用しないのはなぜですか? –
これはもっと好奇心が強いので、具体的な例はありませんが、これはもっと複雑なクラスにはいいと思いました。 – Dylan