Scalaz中出现错误的EitherT过滤器

时间:2016-12-30 11:37:47

标签: scala filter scalaz either

假设我们有EitherT[F, String, A]。 Scalaz的withFilter函数使用String的Monoid的零,以便在过滤器失败时填充Left

因此,没有有意义的错误消息。

我怎样才能实现左派的形式?#34;不积极"。

val a: Either[Future, String, Int] = -1.point[EitherT[Future, String, ?]]

val foo = for {
  aa <- a
  if aa >= 0
} yield aa

filter上的withFilterEitherT方法是否只是为了满足for-comprehension要求?

1 个答案:

答案 0 :(得分:5)

您可以使用EitherT#ensure

import scalaz._, Scalaz._

val xs: List[String \/ Int] =
  List(1.right, 2.right, -5.right, "other error".left, 3.right, -4.right)

EitherT(xs).ensure("not positive")(_ > 0)

// EitherT(List(\/-(1), \/-(2), -\/(not positive), -\/(other error), \/-(3), -\/(not positive)))