Transform O tipi in Scala

2

Ho un tipo Either ad es. Either[A, B] ma voglio Either[X, Y] utilizzando due funzioni A => X e B => Y . Posso farlo con fold:

val myEither: Either[A, B] = ...
myEither.fold(
  a => Left(createNewX()),
  b => Right(createNewY())
)

Ma mi sembra ridondante, visto che devo ripetere Left e Right . Preferisco qualcosa del tipo:

val myEither: Either[A, B] = ...
myEither.transformToEither(
  a => createNewX(),
  b => createNewY()
)

che trasforma un Either[A, B] in un Either[X, Y] creando un Left per il risultato della prima funzione e un Right per il secondo. Qual è il modo più semplice per farlo?

    
posta valenterry 28.07.2015 - 15:44
fonte

1 risposta

1

Il tuo primo approccio è probabilmente il migliore per un accordo occasionale. Se hai bisogno di farlo molto, aggiungerei un metodo map implicito a Either che ti dà l'API che desideri:

object EitherUtils {
  implicit class ImprovedEither[A, B](e: Either[A, B]) {
    def map[X, Y](fa: A => X, fb: B => Y): Either[X, Y] = {
      e.fold(a => Left(fa(a)), b => Right(fb(b)))
    }
  }
}

Scalaz aggiunge un po 'di funzionalità a , che potrebbe essere utile se ti preoccupi abbastanza di scalaz per decifrare la loro documentazione.

Tuttavia, in generale, si vuole pensare a Either come contenitore temporaneo, a volte utile per i passaggi intermedi, piuttosto che come qualcosa che si desidera mantenere a lungo. Se ti trovi a voler operare su un Either , dovrebbe dare una seconda occhiata per vedere se è possibile effettuare il refactoring in precedenza.

    
risposta data 28.07.2015 - 17:03
fonte

Leggi altre domande sui tag