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
Pensavo solo l'importazione di tutto, da una grande biblioteca tale non era una buona idea. Grazie per i link! – Antoine
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