【问题标题】:Scalaz ambiguous import error when working with Monad使用 Monad 时 Scalaz 不明确的导入错误
【发布时间】:2017-05-23 14:56:11
【问题描述】:

我正在做这样的事情

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 速度

【问题讨论】:

    标签: scala monads scalaz


    【解决方案1】:

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

    我认为,如果您要保持相同的导入,您将需要为您的更高类型提供某种类型的改进,或者至少对您的逻辑更加具体。

    类似这样的:

    def test[M[X] <: TraversableOnce[X] : Monad]) = ...
    def test[M[X] <: Option[X] : Monad]) = ...
    

    但如果你使用traverse,我猜你真的在追求sequence,你可以免费使用,并使用sequenceU自动区分。

    List(monadY, monadX, ....).sequenceU
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多