如何启用curried函数继承然后部分应用

时间:2016-04-24 11:00:37

标签: scala functional-programming akka

我是Scala的新手,并尝试学习不同的功能。 我试图在特征中声明一个curried函数(需要两个不同的参数),一半在扩展类中实现它,然后允许用户调用函数只传递第二个参数。

这样的事情:

宣称咖喱功能的特征:

trait MetricGenerator[T] {
  def NextMetricCurrying(generateVal: =>Future[MetricValue[T]])(target: ActorRef): Unit = {
      generateVal onSuccess {case mv:MetricValue[T] => println(target.path.name + " | "+ mv.toString )}
  }
}

现在,我想扩展一个具有此特征的类,然后“half”实现它(通过传递它的第一个函数参数),以便该类的用户将其称为常规函数(而不是curry)。

我尝试过这样的事情:

 class MemoryReader extends MetricGenerator[Long]{

    NextMetricCurrying({
     val p = Promise[MetricValue[Long]]
      builder(sigar => sigar.getMem) onSuccess {
         case Success(mem) => p.success(MetricValue[Long](category, key, computerId, mem.getFree /
         1024 / 1024))
      }
        p.future
      })
}

但它不起作用。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

只使用第一个参数部分应用该函数后,您将获得ActorRef => Unit。如果这是您想要作为函数公开的内容,则需要进行分配。

class Foo extends MetricGenerator[Long] {
  val preparedFun: ActorRef => Unit = NextMetricCurrying(???)
  // note the form A => B
}

val bar = new Foo
bar.preparedFun(anActorRef)

请注意,如果您希望在preparedFun实例后立即调用MetricGenerator,则可以按以下方式重构:

trait MetricGenerator[T] {
  protected def NextMetricCurrying(a: => Future[MetricValue[T]])(b: ActorRef): Unit

  val preparedFun: ActorRef => Unit
}

为了进一步混合继承和功能,它也可以定义如下。

trait  MetricGenerator[T] {
  protected def NextMetricCurrying(a: => Future[MetricValue[T]])(b: ActorRef): Unit
  def nextValue: Future[MetricValue[T]]

  final def preparedFun: ActorRef => Unit = NextMetricCurrying(nextValue)
}