2014-12-18 8 views
6

In ogni esempi che ho letto su Scalaz' funzioni di traslazione, sono stati fatti i seguenti importazioni:Cosa devo importare per Scalaz 'funzionalità di traslazione

import scalaz._ 
import Scalaz._ 

Sembra che io non posso usare traverseU fino a quando ho import Scalaz._.

In che modo l'oggetto Scalaz inietta traverseU nelle mie raccolte? Sono completamente perso nel documento di riferimento.

Cosa devo importare se voglio solo i metodi traverse e traverseU?

risposta

7

Per collection traverseU func dovrete importare sintassi per traverseU (metodo implicito per TraverseOps), esempio implicito Traverse[C] (per collection tipo C) e Applicative[R] (per func risultato tipo R[X]).

Per esempio:

import scalaz.syntax.traverse.ToTraverseOps // F[A] => TraverseOps[F, A] 
import scalaz.std.list.listInstance // Traverse[List] 
import scalaz.std.option.optionInstance // Applicative[Option] 

List(1, 2, 3).traverseU{ Option(_) } 
// Some(List(1, 2, 3)) 

In caso tipo di risultato di func non è R[X] con Applicative[R], ma alcuni R con Monoid[R] si dovrà importare Monoid[R] istanza per metodo implicito Applicative.monoidApplicative:

import scalaz.std.anyVal.intInstance 

List(1, 2, 3).traverseU{ identity } 
// 6 

Nota che listInstance è anche MonadPlus[List], Zip[List], Unzip[List], ecc

Quindi, se si vuole ottenere solo Traverse[List] per qualche buona ragione, si dovrà noi in questo modo:

implicit val traverseList: scalaz.Traverse[List] = scalaz.std.list.listInstance 
implicit val applicativeOption: scalaz.Applicative[Option] = scalaz.std.option.optionInstance 
0

C'è un motivo particolare per cui non si desidera importare l'intera libreria? AFAIK, non puoi importare solo traverse e traverseU - non esistono in modo isolato. Leggi su Typeclass Pattern - che dovrebbe iniziare a rispondere alle tue domande su come Scalaz fa quello che fa. Per ulteriori informazioni su Scalaz in generale, consigliamo la serie learning Scalaz

+0

Pensavo solo l'importazione di tutto, da una grande biblioteca tale non era una buona idea. Grazie per i link! – Antoine

+1

L'importazione del mondo aumenta il tempo di compilazione a causa delle implicazioni aggiuntive nell'ambito. Esistono anche metodi di sintassi che possono essere in conflitto con altre librerie. – drstevens

-1

traverseU è su TraverseOps. La conversione a questo è sfruttata da TraverseSyntax. Quindi import scalaz.syntax.TraverseSyntax._ dovrebbe essere sufficiente.

+1

'TraverseSyntax' è' trait', non 'object'. Non è possibile importare i suoi membri. – senia

Problemi correlati