2017-02-18 29 views
5

İçin Başvuru kullanmak aşağıdaki doğrulama mantığı: Scalaz belgelerine görenasıl Fonksiyon Uygulama

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)){_ + _} 

:

/** 
    * 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. 
    */ 

nasıl doğrulamak işlevini apply2 kullanmak dönüştürebilirim?

cevap

4

Validate için yazıcının yapıcısı iki parametre alır, ancak Apply yalnızca bir tane olan bir kurucu tarafından parametrelenebilir.

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

Evet bunu Arity biri bir tür yapıcı alıyordu uygula fark ama Doğrulama iki kişi gerekir, çünkü tökezledi: Bize türü tanımı köri sağlayan tipi lambda adı verilen özel bir numara gerekir. –

+1

Evet .. Bu genel bir oyun, gerçekten çirkin ama şu an için böyle yapıldı. Temel olarak, bir parametreyi alan bir ad-hoc tipi (lambda tipi) yaratırsınız. Bu, 'Uygula' nın istediği, iki türle yeni bir tür oluşturan ve sonra "bu türü uygula" yı # ile uygular. yeni yarattığımız şeyi al. İki türü String ve Int olarak kodladığımı unutmayın. Kontrol edin, örn. [this] (http://like-a-boss.net/2014/09/27/type-lambda-in-scala.html) veya [bu] (https://blog.adilakhter.com/2015/02/18/uygulamak-scalas tipi lambda /). – slouc