2011-09-22 34 views
18
import scalaz._ 
import Scalaz._ 

"abc".parseInt 

Bu, Validation[NumberFormatException, Int] döndürecektir. Validation[String, Int] almak için hata tarafında bir işlev uygulayabilmemin bir yolu var mı (toString gibi)?Harita üzerinde Scalaz Doğrulama hatası

cevap

19

iyi bir şeyler gelebilir. Bunu böylece Validation, bir bifunctor olur: genellikle soldan sağa akar

((_:NumberFormatException).toString) <-: "123".parseInt 

Scala'nın tip çıkarsama, bu nedenle bu aslında kısadır:

"123".parseInt.<-:(_.toString) 

Ve daha az ek açıklama gerektirir.

+0

Güzel. MAB'de aşağıdakilerin yararlı olabileceğini merak ediyorum: def bimap [C, D] (ilk: A => C = kimlik [A] \ _, ikinci: B => D = kimlik [B] \ _) (dolaylı b : Bifunctor [M]): M [C, D] = b.bimap (değer, birinci, ikinci). Yani biz "123" .parseInt.bimap (\ _. ToString) –

+0

olsun. Bu harika olurdu. Bir çekme isteği gönderin. – Apocalisp

11

FailProjection üzerinde bir functor var. Yani

v.fail.map(f).validation 

yapabilirdi

Alternatif

v.fold(f(_).failure, _.success) 

Hem biraz ayrıntılı (Bundan kurtulmak için FailProjection, doğrulama gibi yazması başarısız). Belki scalaz daha aşina birisi sürece Bifunctor[M] olmadığı için herhangi M[A, B] sol ve sağ tarafında haritasına MAB[M[_,_], A, B] tanımlanan yöntemlerin <-: ve :-> bir çift vardır

+0

, "f andthen Failure" çalışmasını alamıyor: "123" .parseInt.fold (_. ToString andThen Failure) "tür uyuşmazlığı" yazdırır. Diğeri iyi çalışıyor. – huynhjl

+1

@huynhjl: fold iki işlevi alır: hata durumu için ilk, başarı durumu için seconde. v.fold (_. toString.fail, _.success) –

+0

çalışır. Ancak katlama argümanlarının varsayılan değerleri (kimlikler) var değil mi? –