说我有这些声明:
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)
而不是f1
和f2
的函数。我不确定如何表达这一点,但我希望能够为任何Seq[EventFilter]
对象执行此操作
答案 0 :(得分:1)
我假设intercept
接受并在此处返回相同的类型,因为这是以这种方式链接函数的唯一方法。
大多数情况下,您可以使用foldLeft
或foldRight
来完成此类链接。
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.