2017-02-18 13 views
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?

Odpowiedz

4

Konstruktor typów dla Validate przyjmuje dwa parametry, ale Apply można sparametryzować tylko za pomocą konstruktora typu arity one. Potrzebny jest specjalny trik zwany typ lambda, która pozwala nam na curry definicji typu:

def validate(a : String) = Apply[({type λ[Int] = Validation[String, Int]})#λ].apply2(one(a), two(a)){_ + _} 
+0

Tak zauważyłem, że Zastosuj brał konstruktora typu o liczbę operandów jednym ale potknął ponieważ Validation dwojga. –

+1

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

Powiązane problemy