In Nick Partridge's presentation on deriving scalaz , based on an older version of scalaz, he introduces validations using a function:
def even(x: Int): Validation[NonEmptyList[String], Int] =
if (x % 2 == 0) x.success else { s"not even: $x".wrapNel.failure }
Then he combines this using
even(1) <|*|> even(2)
which applies the test and returns a validation with the failure message. Using scalaz 7 I get
scala> even(1) <|*|> even(2)
<console>:18: error: value <|*|> is not a member of scalaz.Validation[scalaz.NonEmptyList[String],Int]
even(1) <|*|> even(2)
^
What is the scalaz 7 equivalent of this combinator?
This is now called tuple
, so you can write for example:
import scalaz._, Scalaz._
def even(x: Int): Validation[NonEmptyList[String], Int] =
if (x % 2 == 0) x.success else s"not even: $x".failureNel
val pair: ValidationNel[String, (Int, Int)] = even(1) tuple even(2)
Unfortunately I'm not sure there's a better way to find out this kind of thing than checking out the last 6.0 tag of the source, searching, and then comparing signatures.
You want to use the |@|
operator.
scala> (even(1) |@| even(2) |@| even(3)) { (_,_,_) }
<console> Failure(NonEmptyList(not even: 1, not even: 3))
scala> (even(2) |@| even(4) |@| even(6)) { (_,_,_) }
<console> Success((2,4,6))
compare that to tuple
operator:
scala> even(1) tuple even(2) tuple even(3)
<console> Failure(NonEmptyList(not even: 1, not even: 3))
scala> even(2) tuple even(4) tuple even(6)
<console> Success(((2,4),6))
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.