でカリーコンストラクタケースクラス、パターンマッチングとScalaの
B(1)("1") match {
case B(a)(b) => print("B")
case C() => print("C")
}
問題はそのパターンマッチングで、カレー化された議論は機能していないようです。このための回避策はありますか?
でカリーコンストラクタケースクラス、パターンマッチングとScalaの
B(1)("1") match {
case B(a)(b) => print("B")
case C() => print("C")
}
問題はそのパターンマッチングで、カレー化された議論は機能していないようです。このための回避策はありますか?
この問題は何ですか?
def m(a: A) = a match {
case b: B => print("B")
case c: C => print("C")
}
これ以上の機能を要求していないため、私は尋ねるだけです。
EDIT
これは助けることができる:
object Dog {
def apply(name: String)(size: Int) = new Dog(name)(size)
def unapply(dog: Dog) = Some(dog.name, dog.size)
}
class Dog(val name: String)(var size: Int)
は今、あなたはどちらか、このような犬を作成することができます:
Dog("Snoopy")(10)
0:
new Dog("Snoopy")(10)
または、このようなしかし、あなたが犬にパターンマッチするとき、コンストラクタパターンはではなく、がカレーされています。 unapply(x$0: Q): Option[Int]
:あなたは、クラスBのために作成適用解除する機能の署名を見れば
Dog("Snoopy")(10) match {
case Dog(a, b) => // do sth with a or b
}
通常のケースクラスを使用して、複数のパラメータリストを持つファクトリメソッドを定義することができます。
コンパニオンオブジェクトで宣言されている場合は、ファクトリメソッドは「適用」できません(これは、 eはケースクラスのおかげで宣言されました)。 – Nicolas
、あなたはそれがあることがわかります。したがって、未適用関数は、ケースクラスのパラメータの最初の範囲で機能します。
Scalaの仕様(§5.3.2)によって確認された:ケースクラス の第1のパラメータセクションで仮パラメータを要素と呼ばれ
。彼らは特別に扱われます。まず、そのようなパラメータの値をコンストラクタパターンのフィールドとして抽出することができる。 。
第1パラメータセクションのみがエクストラクタを介して利用可能であることが明らかです。
いくつかの回避策:
case [email protected](3) if x.b == "bazinga" => ...
あなたの最初の例はうまくいくでしょうが、醜い型キャストをしなくてもcase文のB.aとB.bにアクセスすることはできません。また、あなたの編集では、なぜコンストラクタパターンがカレー化されていないのか分かりません。それは適用されないためですか? –
正直言って私はそれがなぜ機能するのか分かりません。私は試行錯誤してそれを見つけた。これはScala仕様のどこかで言及されています。あなたのケースでそれが適切であれば、それを見たいかもしれません。 – agilesteel
はい、caseステートメントで使用するパターンは、unapply関数の結果で指定されたパターンです。それは決してカレー化することはできません。スカラ仕様の対応するセクションは、8.1.8 – Nicolas