使用Monad时Scalaz模糊导入错误

时间:2017-05-23 14:56:12

标签: scala monads scalaz

我正在做这样的事情

for {
  x <- MonadX
  y <- MonadY
} yield {
  (x, y)
}

MonadXMonadY的类型为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

1 个答案:

答案 0 :(得分:0)

我认为因为你没有限制更高的类型并且你有这些导入,编译器会尝试执行隐式解决方案,简而言之,它会告诉你List[_]和{{1} }}可以匹配Option[_]

我认为如果你要保持相同的导入,你需要为更高级别的类型提供某种类型的改进,或者至少更具体地说明你的逻辑。

这样的事情:

M[X]

但是如果您使用的是def test[M[X] <: TraversableOnce[X] : Monad]) = ... def test[M[X] <: Option[X] : Monad]) = ... ,我猜你实际上是在traverse,你可以免费使用,并使用sequence自动区分。

sequenceU