2

我有:

val having: Option[String] = ...

val averageStream = having match {
  case Some(expr) => stream[TimeMovingAverage].filter("name = '#name'").where(expr)
  case None       => stream[TimeMovingAverage].filter("name = '#name'")
}

是否有一些 scalaz 魔法可以消除重复?

我可以做类似的事情

val averageStream1 = stream[TimeMovingAverage].filter("name = '#name'")
val averageStream2 = having.map(averageStream1.where(_))

但这似乎有点尴尬。我想我正在寻找类似的东西

val averageStream = stream[TimeMovingAverage].filter("name = '#name'") |?| having.cata(_.where(_), _)
// Clearly some ambiguities with the _'s here
4

1 回答 1

2
stream[TimeMovingAverage].filter("name = '#name'") |> { str =>
  having.cata(str.where(_), str)
}

甚至

stream[TimeMovingAverage].filter("name = '#name'") |> (
  having.cata(expr => _.where(expr), identity) : T => T
)

T => T必须更改为stream[TimeMovingAverage]使其不太实用的类型,除非您|>在 scalaz 中找到以下专业化或自己定义它:

implicit def WrapIt[T](t: T) = new {
  def |~> (arg: T => T) = arg(t)
  def |?> (arg: Option[T => T]): T = arg.getOrElse(identity (_:T)).apply(t)
}

stream[TimeMovingAverage].filter("name = '#name'") |~> having.cata(expr => _.where(expr), identity)

stream[TimeMovingAverage].filter("name = '#name'") |?> having.map(expr => _.where(expr))

不过,不确定是否真的应该想出这样的东西。

于 2011-12-08T16:29:35.757 回答