2015-10-07 15 views
5

In Nick Partridge's presentation on deriving scalaz, sulla base di una versione precedente di scalaz, introduce convalide utilizzando una funzione:scalaz 7 equivalente di `<|*|>` da scalaz 6

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

Poi si combina questo con

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

che applica il test e restituisce una convalida con il messaggio di errore. Utilizzo di scalaz 7 Ottiene

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

Qual è l'equivalente di scalaz 7 di questo combinatore?

+0

Non ti piuttosto vuole utilizzare '|' operatore | @? Il video che hai postato non lo menziona ma puoi scoprirne di più qui: http://eed3si9n.com/learning-scalaz/Validation.html – mjaskowski

+0

In particolare puoi quindi scrivere 'scala> (even (1) | @ | even (2) | @ | even (3)) {_ + _ + _} '' Errore (NonEmptyList (nemmeno: 1, nemmeno: 3)) 'e ' scala> (pari (2) | @ | even (4) | @ | even (6)) {_ + _ + _}) '' Success (12) ' – mjaskowski

+0

@mjaskowski' | @ | 'è molto generico e nei casi in cui si desidera per comprimere insieme due valori in una tupla, 'tuple' (precedentemente noto come' <|*|> ') è più appropriato. –

risposta

5

questo è ora chiamato tuple, in modo da poter scrivere ad esempio:

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) 

Purtroppo io non sono sicuro che ci sia un modo migliore per scoprire questo genere di cose di check-out l'ultimo 6.0 tag del origine, ricerca e confronto di firme.

+1

C'era un'annotazione di deprecazione che punta a 'tuple' in 7.0, ma questo è naturalmente andato in 7.1. – Hugh

+0

C'è un errore di battitura. failNel dovrebbe essere failureNel –

+0

@Cloudtech 'failNel' è ancora in circolazione in 7.1, ma è deprecato, quindi l'ho cambiato. –

-1

Si desidera utilizzare l'operatore |@|.

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)) 

Confronti che, per tuple operatore:

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

Sicuramente _can_utilizzerai '| @ |' qui, ma non vedo alcuna indicazione che questo è ciò che l'OP _wants_. '| @ |' esisteva in Scalaz 6 e faceva la stessa cosa in 7-'<|*|>' è qualcosa di più specifico che ha cambiato nome. –

+0

A cosa serve 'tuple' su' | @ | 'nello scenario di Validazione? – mjaskowski

+0

Perché lo scenario è importante? Quando si desidera una tupla, 'tuple' è più precisa, meno potente, più leggibile e più chiara sull'intento di' | @ | '-questi sono tutti i motivi per preferirlo. –