0

部分的に適用された関数を抽出または問い合わせて、適用された値を取得する方法はありますか。たとえば、次のコードの reduceBy3 から値 3 を抽出できますか。

def subtract(x:Int, y:Int) = x-y
val reduceBy3 = subtract(3,_:Int)

以下の例に示すエクストラクタの作成を試してみましたが、unapply メソッドは、問い合わせを必要とする (Int=>Int) 関数を受け入れる必要があります。

class ReduceBy(y: Int) {
  val amt = y
  def subtract(y: Int, x: Int) = x - y
}

object ReduceBy extends Function1[Int, Int => Int] {
  def apply(y: Int) = {
    val r = new ReduceBy(y)
    r.subtract(y, _: Int)
  }
  def unapply(reduceBy: ReduceBy): Option[Int] = Some(reduceBy.amt)
}

object ExtractPartialApplied extends App {
  val r3 = ReduceBy(3)
  val extract = r3 match {
    case ReduceBy(x) => ("reduceBy", x)
    case x: ReduceBy => ("reduceBy", x.amt)
    case _ => ("No Match", 0)
  }

  println(extract)
  val z = r3(5)
  println(z)
}
4

2 に答える 2

0

danielkza による回答を適応させる解決策は、コンパニオン オブジェクトに抽出を実行させ、初期値を保持する ReduceBy 関数を返すことです。

object ReduceBy {
  def apply(y: Int) = new ReduceBy(y) 
  def unapply(reduceBy: ReduceBy): Option[Int] = Some(reduceBy.amt)
}    

class ReduceBy(val amt: Int) extends Function[Int, Int] {
  def apply(y: Int) = y - amt
} 

object ExtractPartialApplied extends App {
  val reduceBy3 = ReduceBy(3)
  val extract = reduceBy3 match {
    case ReduceBy(x) => ("ReduceBy(x)", x)
    case x: ReduceBy => ("ReduceBy", x.amt)
    case _ => ("No Match", 0)
  }
  println(extract)
  println(reduceBy3(5))
}
于 2013-10-13T05:11:09.707 に答える
0

subtractメソッドに最初のパラメーターを受け取ってから、関数のようなオブジェクトを返します。このオブジェクトは、複数の引数リスト関数と同様に、2 番目のパラメーターを受け取りますが、必要に応じて拡張できます。

ただし、これはあまりエレガントに見えず、手動のボイラープレートが少し必要です。

class ReduceBy(val amt: Int) {
  def subtract(x: Int) = {
    val xx = x // avoid shadowing
    new Function[Int, Int] {
      def x = xx
      def apply(y: Int) = x - y
    }
  }
}
于 2013-10-12T04:34:17.343 に答える