Scala 泛型类型推断为空

scala generic type inference to nothing

我有以下使用 Scalaz 的 ReaderWriterState 的代码。我的泛型类型参数 K 在编译期间被推断为 Nothing。有人可以告诉我发生了什么事吗?

object O {
    type VM = VirtualMachine

    def getQueue[K, R]: RWS[VM, Map[K, R], EventQueue, Unit] = RWS {
        case (vm, s) => (Map[K,R](), (), s)
    }

    def processEventSet[K, R](f: Event => R): RWS[VM, Map[K,R], EventQueue, Seq[R]] = RWS {
        case (vm, q) => 
            val set = q.remove
            (Map.empty[K, R], set.eventIterator.toSeq map f, q)
    }

    def resume[K, R]: RWS[VM, Map[K,R], EventQueue, Seq[R]] = RWS {
        case (vm, q) => vm.resume();(Map.empty[K,R], List.empty[R], q)
    }

    def process(f: Event => Int): RWS[VM, Map[Int, Int], EventQueue, Seq[Int]] = for {
        _ <- getQueue
        res <- processEventSet(f)
        _ <- resume
    } yield res

    def processT[K, R](f: Event => R): RWS[VM, Map[K,R], EventQueue, Seq[R]] = for {
        _ <- getQueue
        res <- processEventSet(f)
        _ <- resume
    } yield res
}

行的错误(sbt 11.3, scalaz 7.3)

res <- processEventSet(f) processT

**found   : Seq[R] => scalaz.IndexedReaderWriterStateT[scalaz.Id.Id,O.VM,Map[Nothing,R],com.sun.jdi.event.EventQueue,com.sun.jdi.event.EventQueue,Seq[R]]
[error]     (which expands to)  Seq[R] => scalaz.IndexedReaderWriterStateT[scalaz.Id.Id,com.sun.jdi.VirtualMachine,Map[Nothing,R],com.sun.jdi.event.EventQueue,com.sun.jdi.event.EventQueue,Seq[R]]
[error]  required: Seq[R] => scalaz.IndexedReaderWriterStateT[scalaz.Id.Id,O.VM,Map[K,R],com.sun.jdi.event.EventQueue,com.sun.jdi.event.EventQueue,Seq[R]]
[error]     (which expands to)  Seq[R] => scalaz.IndexedReaderWriterStateT[scalaz.Id.Id,com.sun.jdi.VirtualMachine,Map[K,R],com.sun.jdi.event.EventQueue,com.sun.jdi.event.EventQueue,Seq[R]]
[error]                 res <- processEventSet(f)
[error]                     ^
[error] XXX:218: diverging implicit expansion for type scalaz.Semigroup[Map[K,R]]
[error] starting with value intInstance in trait AnyValInstances
[error]                 _ <- getQueue
[error]                   ^**

函数

def processEventSet[K, R](f: Event => R): RWS[VM, Map[K,R], EventQueue, Seq[R]] 

对于如何推断类型 K 没有任何线索。所有类型都应该可以从函数参数中推断出来。

您可能想要显式提供它,或者创建另一个参数(甚至是隐式的)以允许编译器推断类型。例如:

trait TypeHelper[K,R]
implicit object intHelper extends TypeHelper[Int, Int] 

def processEventSet[K, R](f: Event => R)(implicit ev: TypeHelper[K,R]): 
  RWS[VM, Map[K,R], EventQueue, Seq[R]] 

这可能会给编译器足够的信息来推断类型。 (虽然我还没有测试过。)