在每个例子中,我都读到了Scalaz'遍历功能,完成以下导入:
import scalaz._
import Scalaz._
在我traverseU
之前,我似乎无法使用import Scalaz._
。
Scalaz对象如何向我的集合注入traverseU
?我完全迷失在参考文档中。
如果我只想要traverse
和traverseU
方法,我应该导入什么内容?
答案 0 :(得分:8)
对于collection traverseU func
,您必须导入traverseU
的语法(TraverseOps
的隐式方法),Traverse[C]
的隐式实例(适用于collection
键入C
)和Applicative[R]
(func
结果类型R[X]
)。
例如:
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))
如果func
的结果类型不是R[X]
Applicative[R]
,R
Monoid[R]
Monoid[R]
,则必须导入{{} 1}}隐式方法Applicative.monoidApplicative
的实例:
import scalaz.std.anyVal.intInstance
List(1, 2, 3).traverseU{ identity }
// 6
请注意,listInstance
也是MonadPlus[List]
,Zip[List]
,Unzip[List]
等。
因此,如果您出于某种充分的理由只想获得Traverse[List]
,那么您必须这样做:
implicit val traverseList: scalaz.Traverse[List] = scalaz.std.list.listInstance
implicit val applicativeOption: scalaz.Applicative[Option] = scalaz.std.option.optionInstance
答案 1 :(得分:0)
您是否有特殊原因想要导入整个库? AFAIK,你不能只导入遍历和遍历 - 它们不是孤立存在的。阅读Typeclass Pattern - 应该开始回答有关Scalaz如何做的问题。要了解有关Scalaz的更多信息,我建议使用learning Scalaz系列
答案 2 :(得分:-1)
traverseU
在TraverseOps
上。 TraverseSyntax
对此进行了转换。所以import scalaz.syntax.TraverseSyntax._
就足够了。