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

"abc".parseInt 

Điều này sẽ trả lại Validation[NumberFormatException, Int]. Có cách nào tôi có thể áp dụng một chức năng ở phía lỗi (chẳng hạn như toString) để nhận được Validation[String, Int] không?Bản đồ xác nhận thất bại Scalaz

Trả lời

19

Có một cặp phương pháp <-::-> xác định trên MAB[M[_,_], A, B] rằng bản đồ ở phía bên trái và bên phải của bất kỳ M[A, B] miễn là có một Bifunctor[M]. Validation sẽ xảy ra là một bifunctor, vì vậy bạn có thể làm điều này:

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

suy luận kiểu Scala của thường chảy từ trái sang phải, vì vậy đây là thực sự ngắn:

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

Và đòi hỏi ít chú thích.

+0

Tuyệt. Tôi tự hỏi thời tiết sau đây có thể hữu ích trong MAB: def bimap [C, D] (đầu tiên: A => C = danh tính [A] \ _, thứ hai: B => D = danh tính [B] \ _) (ẩn b : Bifunctor [M]): M [C, D] = b.bimap (giá trị, thứ nhất, thứ hai). Vì vậy, chúng tôi nhận được "123" .parseInt.bimap (\ _. ToString) –

+0

Điều đó thật tuyệt vời. Gửi yêu cầu kéo. – Apocalisp

11

Có một hàm trên FailProjection. Vì vậy, bạn có thể làm

v.fail.map(f).validation 

(không gõ như FailProjection, xác nhận để có được ra khỏi nó)

Ngoài ra

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

Cả một chút dài dòng. Có lẽ ai đó quen thuộc hơn với scalaz có thể đưa ra một cái gì đó tốt hơn

+0

không thể nhận được 'f andthen Failure' để làm việc:' "123" .parseInt.fold (_. ToString vàThen Failure) 'in' loại không khớp '. Một trong những khác hoạt động tốt. – huynhjl

+1

@huynhjl: fold mất hai chức năng: lần đầu tiên cho trường hợp lỗi, thứ hai cho trường hợp thành công. v.fold (_. toString.fail, _.success) hoạt động –

+0

Nhưng đối số gấp có giá trị mặc định (danh tính) có họ không? –

Các vấn đề liên quan