在对象外部导入 scalaz.syntax.traverse._ 不起作用

import scalaz.syntax.traverse._ outside the object does not work

在 scala7.0.6 上:以下程序有效:

import scalaz._, Scalaz._

object Playground extends App {
  val smallNumbers = List(1,2,3,4,5)
  val doubleSmall: Int => Option[Int] = x => if (x < 30) Some(x * 2) else None

  import scalaz.syntax.traverse._

  println(smallNumbers.traverse(doubleSmall))
}

但是,如果我将 import scalaz.syntax.traverse._ 移到文件顶部的对象 Playground 之外,那么我会得到:

Error: value traverse is not a member of List[Int]

这是为什么?

当您在同一范围内导入 Scalaz._scalaz.syntax.traverse._ 时:

<ToTraverseOps: error> is not a valid implicit value for
  Wrapper.Playground.smallNumbers.type => ?{def traverse: ?} because:
reference to ToTraverseOps is ambiguous;
it is imported twice in the same scope by
import scalaz.syntax.traverse._
and import Scalaz._
           println(smallNumbers.traverse(doubleSmall))

如果 Scalaz._scalaz.syntax.traverse._ 在不同的(嵌套)作用域中导入则没有冲突,后者会覆盖前者。或者你可以完全删除import scalaz.syntax.traverse._,它会编译。

scalac 有标志 -Xlog-implicits 这有帮助。