在我阅读的有关Scalaz遍历功能的每个示例中,都完成了以下导入:

import scalaz._
import Scalaz._

直到我traverseU,我似乎才能使用import Scalaz._

Scalaz对象如何将traverseU注入(inject)我的收藏集?我完全迷失了引用文档。

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

最佳答案

对于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]导入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

关于scala - 我应该为Scalaz的导线功能导入什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27548802/

10-12 03:51
查看更多