2011-08-10 26 views
6

Tôi cố gắng để đưa ra một cái gì đó tương tự như sau:scalaz xác nhận và danh sách đơn nguyên

val s: Validation[String, Int] = 1.success 
def s2(i: Int): Validation[String, Int] = i.success 

val result = for { 
    i <- s 
    j <- List(1, 2) 
    k <- s2(j) 
} yield "fine"; 

Đoạn mã trên không biên dịch và tôi hiểu, cú pháp nó không có ý nghĩa.

Tôi đang cố gắng thực thi danh sách xác thực theo cách đơn thuần. Làm thế nào để đạt được điều đó?

+4

Xin chào một chút lạ khi thấy những gì bạn muốn đạt được. Nếu bạn muốn xác nhận chuỗi tôi đề nghị xem ở đây (applicative) trong dòng 97 có thể giúp: https: //github.com/scalaz/scalaz/blob/master/example/src/main/scala/scalaz/example/ExampleValidation .scala – AndreasScheinert

Trả lời

8

Nếu bạn có một danh sách kiểm chứng thực của A, bạn có thể biến nó thành một xác nhận danh sách của A sử dụng sequence:

List(1, 2).map(s2).sequence[({type l[a]=Validation[String, a]})#l, Int] 

(nếu tôi hiểu câu hỏi một cách chính xác). Vì vậy, bạn nhận được

val result = for { 
    i <- s 
    k <- List(1, 2).map(s2).sequence[({type l[a]=Validation[String, a]})#l, Int] 
} yield "fine" 
+0

Tuyệt vời. đó là chính xác những gì tôi đang tìm kiếm. Cảm ơn. – sanjib

+0

Rất tiếc, đã trả lời quá sớm. Nó gần như là những gì tôi đang tìm kiếm. Ở đây tất cả các xác nhận hợp lệ trong danh sách được tính toán. Tôi đã hy vọng sẽ ngừng tính toán khi tôi nhận được sự thất bại. Làm thế nào để làm điều đó ? – sanjib

+0

Không thể kiểm tra nó vào lúc này, nhưng hãy thử sử dụng 'Dòng' (tức là danh sách lười) thay vì' Danh sách', hoặc 'Danh sách (1, 2) .view.map (s2) ...'. –

4

Bạn dường như đang sử dụng xác thực cho tác dụng phụ. Đây không phải là ý nghĩa của nó. Bạn sử dụng các giá trị trả về trong lập trình hàm.

Xác thực trong một sự hiểu biết tiếp tục với thành công, nhưng bị hỏng khi thất bại và trả về lỗi.

scala> def g(i: Int): Validation[String, Int] = { 
      println(i); if(i % 2 == 0) i.success else "odd".fail 
     } 
g: (i: Int)scalaz.Validation[String,Int] 

scala> val result = for { 
    | i <- g(1) 
    | j <- g(2) 
    | } yield (i,j) 
1 
result: scalaz.Validation[String,(Int, Int)] = Failure(odd) 

scala> val result = for { 
    | i <- g(2) 
    | j <- g(1) 
    | } yield (i,j) 
2 
1 
result: scalaz.Validation[String,(Int, Int)] = Failure(odd) 


scala> val result = for { 
    | i <- g(2) 
    | j <- g(2) 
    | } yield (i,j) 
2 
2 
result: scalaz.Validation[String,(Int, Int)] = Success((2,2)) 


scala> val result = for { 
    | i <- g(1) 
    | j <- g(1) 
    | } yield (i,j) 
1 
result: scalaz.Validation[String,(Int, Int)] = Failure(odd) 
Các vấn đề liên quan