5
Mam następującą logikę walidacjiJak korzystać Zastosuj do funkcji aplikacji
def one(a : String) : Validation[String, Int] =
if (a == "one") {
Success(1)
} else {
Failure("Not One")
}
def two(a : String) : Validation[String, Int] =
if (a == "two") {
Success(2)
} else {
Failure("Not Two")
}
def validate (a : String) = (one(a) |@| two(a)){_ + _}
zgodnie z dokumentacją Scalaz:
/**
* DSL for constructing Applicative expressions.
*
* `(f1 |@| f2 |@| ... |@| fn)((v1, v2, ... vn) => ...)` is an alternative to `Apply[F].applyN(f1, f2, ..., fn)((v1, v2, ... vn) => ...)`
*
* `(f1 |@| f2 |@| ... |@| fn).tupled` is an alternative to `Apply[F].applyN(f1, f2, ..., fn)(TupleN.apply _)`
*
* Warning: each call to `|@|` leads to an allocation of wrapper object. For performance sensitive code, consider using
* [[scalaz.Apply]]`#applyN` directly.
*/
Jak przekonwertować z funkcji sprawdzania poprawności do korzystania apply2
?
Tak zauważyłem, że Zastosuj brał konstruktora typu o liczbę operandów jednym ale potknął ponieważ Validation dwojga. –
Taa ... To zwykła sztuczka, naprawdę brzydka, ale tak to się teraz robi. Zasadniczo tworzysz typ ad-hoc (typ lambda), który przyjmuje jeden parametr, który jest tym, czego chce 'Apply', który tworzy nowy typ z dwoma typowymi typami, a następnie" aplikujesz ten typ "z # (teraz jest ok weź to, co właśnie stworzyliśmy). Zauważ, że zakodowałem dwa typy w String i Int. Sprawdź na przykład [this] (http://like-a-boss.net/2014/09/27/type-lambda-in-scala.html) lub [this] (https://blog.adilakhter.com/2015/02/18/apply-scalas-type-lambda /). – slouc