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 => Tscalazで次の専門分野を見つけたり、自分で定義したりしstream[TimeMovingAverage]ない限り、実用性が低くなるタイプに変更する必要があります。|>

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 に答える