2015-10-07 15 views
5

Trong Nick Partridge's presentation on deriving scalaz, dựa trên một phiên bản cũ của scalaz, ông giới thiệu kiểm chứng thực bằng cách sử dụng chức năng:scalaz 7 tương đương của `<|*|> 'từ scalaz 6

def even(x: Int): Validation[NonEmptyList[String], Int] = 
    if (x % 2 == 0) x.success else { s"not even: $x".wrapNel.failure } 

Sau đó, ông kết hợp này sử dụng

even(1) <|*|> even(2) 

áp dụng thử nghiệm và trả về xác thực với thông báo lỗi. Sử dụng scalaz 7 Tôi nhận được

scala> even(1) <|*|> even(2) 
<console>:18: error: value <|*|> is not a member of scalaz.Validation[scalaz.NonEmptyList[String],Int] 
     even(1) <|*|> even(2) 
      ^

Tương đương scalaz 7 của tổ hợp này là gì?

+0

Bạn sẽ không muốn sử dụng '| @ |' điều hành? Video bạn đăng không đề cập đến nó nhưng bạn có thể tìm hiểu thêm về nó ở đây: http://eed3si9n.com/learning-scalaz/Validation.html – mjaskowski

+0

Cụ thể là bạn có thể viết 'scala> (thậm chí (1) | @ | even (2) | @ | even (3)) {_ + _ + _} '' Thất bại (NonEmptyList (thậm chí không: 1, thậm chí không: 3)) 'và ' scala> (thậm chí (2) | @ | thậm chí (4) | @ | thậm chí (6)) {_ + _ + _}) '' Thành công (12) ' – mjaskowski

+0

@mjaskowski' | @ | 'là rất chung chung và trong trường hợp bạn chỉ muốn để nối hai giá trị trong một bộ tuple, 'tuple' (trước đây được gọi là' <|*|> ') là thích hợp hơn. –

Trả lời

5

này bây giờ được gọi là tuple, vì vậy bạn có thể viết ví dụ:

import scalaz._, Scalaz._ 

def even(x: Int): Validation[NonEmptyList[String], Int] = 
    if (x % 2 == 0) x.success else s"not even: $x".failureNel 

val pair: ValidationNel[String, (Int, Int)] = even(1) tuple even(2) 

Đáng tiếc là tôi không chắc chắn có một cách tốt hơn để tìm ra loại điều hơn kiểm tra ra các 6,0 thẻ cuối cùng của nguồn, tìm kiếm, và sau đó so sánh chữ ký.

+1

Có một chú thích không dùng nữa trỏ một đến 'tuple' trong 7.0, nhưng điều này tự nhiên đã biến mất trong 7.1. – Hugh

+0

Có lỗi đánh máy. failNel phải là lỗiNếu –

+0

@Cloudtech 'failNel' vẫn còn ở mức 7.1, nhưng nó không được chấp nhận, vì vậy tôi đã thay đổi nó. –

-1

Bạn muốn sử dụng toán tử |@|.

scala> (even(1) |@| even(2) |@| even(3)) { (_,_,_) } 
<console> Failure(NonEmptyList(not even: 1, not even: 3)) 

scala> (even(2) |@| even(4) |@| even(6)) { (_,_,_) } 
<console> Success((2,4,6)) 

so sánh với tuple điều hành:

scala> even(1) tuple even(2) tuple even(3) 
<console> Failure(NonEmptyList(not even: 1, not even: 3)) 

scala> even(2) tuple even(4) tuple even(6) 
<console> Success(((2,4),6)) 
+2

Bạn chắc chắn _can_ sử dụng '| @ |' ở đây, nhưng tôi không thấy bất kỳ dấu hiệu nào cho thấy đó là OP _wants_. '| @ |' tồn tại trong Scalaz 6 và thực hiện tương tự như trong 7 - '<|*|>' là một cái gì đó cụ thể hơn đã thay đổi tên của nó. –

+0

Điều gì là 'tuple' trên' | @ | 'trong kịch bản Xác thực? – mjaskowski

+0

Tại sao kịch bản lại quan trọng? Khi bạn muốn một tuple, 'tuple' là chính xác hơn, ít mạnh mẽ hơn, dễ đọc hơn, và rõ ràng hơn về ý định hơn' | @ | '- đây là tất cả các lý do để thích nó. –

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