如何将以块作为输入的调用链接起来?

时间:2015-07-08 16:33:30

标签: scala

说我有这些声明:

val f1 = EventFilter.info(pattern = s"starting calls: three_step.ps, three_step.ps2, three_step.ps3", occurrences = 1)
val f2 = EventFilter.info(pattern = s"starting calls: three_step.cgrep, three_step.wc", occurrences = 1)
val f = Seq(f1, f2)

现在我可以这样做:

f1.intercept { f2.intercept {
  ... Some code here ...
}}

但是,我希望第一行直接表示为val f = Seq(f1, f2)而不是f1f2的函数。我不确定如何表达这一点,但我希望能够为任何Seq[EventFilter]对象执行此操作

2 个答案:

答案 0 :(得分:1)

我假设intercept接受并在此处返回相同的类型,因为这是以这种方式链接函数的唯一方法。

大多数情况下,您可以使用foldLeftfoldRight来完成此类链接。

eventFilters.foldLeft(startingValue) { 
    case (acc, next) => next.intercept(acc) 
}

您可能也对documentation感兴趣,它将一系列函数T => T链接在一起。如果您想要使用它,则需要将Seq[EventFilter]变为Seq[Foo => Foo](其中Foo是[{1}}的参数/返回类型):

intercept

答案 1 :(得分:1)

这应该适用于scalaz:

implicit def endofunctionMonoid[A] = new Monoi[Function1[A, A]] {
  def append(f1: Function1[A, A], f2: => Function1[A, A]): Function1[A, A] =
    f1 _ compose f2 _
  def zero: Function1[A, A] = a => a
}
val fs = List(f1, f2) // event filters
fs.foldMap { _.intercept _ } // map the list to Function1s and accumulate via the semigroup operation.