我应该为Scalaz'导入什么?遍历功能

时间:2014-12-18 14:26:44

标签: scala scalaz

在每个例子中,我都读到了Scalaz'遍历功能,完成以下导入:

import scalaz._
import Scalaz._

在我traverseU之前,我似乎无法使用import Scalaz._

Scalaz对象如何向我的集合注入traverseU?我完全迷失在参考文档中。

如果我只想要traversetraverseU方法,我应该导入什么内容?

3 个答案:

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

traverseUTraverseOps上。 TraverseSyntax对此进行了转换。所以import scalaz.syntax.TraverseSyntax._就足够了。