在scala中,作为匿名函数的类成员的参数化返回类型

时间:2014-09-26 19:06:12

标签: scala

我想要的是以下内容:

class Foo(val f: (Bar => A) => A) {
  def consume(x: Int): Unit = {
    val myStr: String = f(bar => bar.getStr)
    val myInt: Int    = f(bar => bar.getInt)
    writeToLog(s"$myStr: ${myInt + x}")
  }
}

我知道我可以通过使用带有类型参数的apply方法为f定义类型来实现此目的。我的问题是,如果不定义这样的类型,我能实现这一目标吗顺便说一句,我没有直接使用Bar,因为每个Bar都是一个rpc对象(例如节俭),我已经设置并拆除了我用这种模式避免的样板代码。

1 个答案:

答案 0 :(得分:0)

我不确定它究竟是你需要的,但我可以建议使用无形的多态函数:

  import shapeless._
  import poly._

  class Bar {
    def getStr = "str"
    def getInt = 1
  }

  type Extractor[T] = Bar => T

  object extract extends Poly1 {
    implicit def caseStr = at[Extractor[String]](f => f.andThen(identity))
    implicit def caseInt = at[Extractor[Int]](f => f.andThen(identity))
  }

  class Foo(bar: Bar) {
    def e[T](f: Bar => T): Extractor[T] = f

    def consume(x: Int): Unit = {
      val myStr: String = extract(e(_.getStr)) apply bar
      val myInt: Int    = extract(e(_.getInt)) apply bar
      println(s"$myStr: ${myInt + x}")
    }
  }

  new Foo(new Bar).consume(1)

所以你需要为每个case(String,Int等)定义函数。而我只使用了身份。在你的例子中,你永远不会传递Bar,但你在某些时候肯定需要它来计算String和Int