我正在做这样的事情
for {
x <- MonadX
y <- MonadY
} yield {
(x, y)
}
MonadX
和MonadY
的类型为M[X]
和M[Y]
,我提供了一个实例implicit m: Monad[M]
这是我的导入
import scalaz.Monad
import scalaz.std.list._
import scalaz.syntax.traverse._
import scalaz.Scalaz.ToBindOps
import scalaz.Scalaz.ToApplyOps
我的错误是:
[error] both value optionInstance in trait OptionInstances of type => scalaz.Traverse[Option] with scalaz.MonadPlus[Option] with scalaz.Each[Option] with scalaz.Index[Option] with scalaz.Length[Option] with scalaz.Cozip[Option] with scalaz.Zip[Option] with scalaz.Unzip[Option] with scalaz.Align[Option] with scalaz.IsEmpty[Option] with scalaz.Cobind[Option] with scalaz.Optional[Option]{def point[A](a: => A): Some[A]; def cojoin[A](a: Option[A]): Option[Some[A]]}
[error] and value listInstance in trait ListInstances of type => scalaz.Traverse[List] with scalaz.MonadPlus[List] with scalaz.Each[List] with scalaz.Index[List] with scalaz.Length[List] with scalaz.Zip[List] with scalaz.Unzip[List] with scalaz.Align[List] with scalaz.IsEmpty[List] with scalaz.Cobind[List]{def empty[A]: scala.collection.immutable.Nil.type}
[error] match expected type scalaz.Monad[M]
关键是我不想导入scalaz._和Scalaz._因为我不想放慢我的IDE
答案 0 :(得分:0)
我认为因为你没有限制更高的类型并且你有这些导入,编译器会尝试执行隐式解决方案,简而言之,它会告诉你List[_]
和{{1} }}可以匹配Option[_]
。
我认为如果你要保持相同的导入,你需要为更高级别的类型提供某种类型的改进,或者至少更具体地说明你的逻辑。
这样的事情:
M[X]
但是如果您使用的是def test[M[X] <: TraversableOnce[X] : Monad]) = ...
def test[M[X] <: Option[X] : Monad]) = ...
,我猜你实际上是在traverse
,你可以免费使用,并使用sequence
自动区分。
sequenceU