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]]
这可能会给编译器足够的信息来推断类型。 (虽然我还没有测试过。)
我有以下使用 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]]
这可能会给编译器足够的信息来推断类型。 (虽然我还没有测试过。)