8

ケースパターンをパラメータとして他の関数に渡すことは可能ですか?このようなもの:

def foo(pattern: someMagicType) {
  x match {
    pattern => println("match")
  }
}

def bar() {
  foo(case List(a, b, c))
}
4

3 に答える 3

4

では、パターンマッチングブロックを別の関数に渡したいですか?PartialFunction次の例に示すように、これはsを使用して実行できます。

def foo(f:PartialFunction[String, Int]) = {
  f("")
}

foo {
  case "" => 0
  case s => s.toInt
}
于 2012-08-16T12:20:20.997 に答える
3

キム・ステベルの最初の答えはあなたが望むものに近いと思います。「パターンマッチそれ自体」は、Scalaでは孤立したエンティティではありません。一致は、またはとして定義できます。Function1PartialFunction

def foo[A, B](x: A)(pattern: PartialFunction[A, B]): Unit =
  if(pattern.isDefinedAt(x)) println("match")

def bar(list: List[String]): Unit =
  foo(list){ case List("a", "b", "c") => }

テスト:

bar(Nil)
bar(List("a", "b", "c"))

または、構成を使用します。

def foo[A, B](x: A)(pattern: PartialFunction[A, B]): Unit = {
  val y = pattern andThen { _ => println("match")}
  if (y.isDefinedAt(x)) y(x)
}
于 2012-08-16T15:49:30.100 に答える
0

あなたの魔法のタイプは、適用されないメソッドを持つ構造タイプとして書くことができます。必要な抽出装置の種類に応じて、unapplyまたはの種類が異なりますunapplySeq。以下は簡単な例です。

def foo(x:Int, Pattern: { def unapply(x:Int):Boolean }) {
  x match {
    case Pattern => println("match")
  }
}

foo(1, new { def unapply(x:Int) = x > 0 })

そして、これはリストに対してどのように行われるかです:

foo(List(1,2,3), new { def unapplySeq(x:List[Int]):Option[List[Int]] = if (x.size >= 3) Some(x) else None })

def foo(x:List[Int], Pattern: { def unapplySeq(x:List[Int]):Option[List[Int]] }) {
  x match {
    case Pattern(a,b,c) => println("match: " + a + b + c)
  }
}
于 2012-08-16T14:45:51.543 に答える