Scala 未找到部分应用类型的隐式

Scala 未找到部分应用类型的隐式,scala,implicit,shapeless,partially-applied-type,Scala,Implicit,Shapeless,Partially Applied Type,虽然这个问题是在使用和的代码中发现的,但是这种行为可以在没有它们的情况下重现 假设我有一个简单的typeclass,用于具体化不完整实现的typeclass实例(的镜像) 和一些非常简单的类型类来测试它 sealed class FirstIs[M, T] object FirstIs { implicit def firstIs[M, D]: FirstIs[M, (M, D)] = new FirstIs } 如果我尝试通过alias部分应用FirstIs,并通过LiftAll1 ty

虽然这个问题是在使用和的代码中发现的,但是这种行为可以在没有它们的情况下重现

假设我有一个简单的typeclass,用于具体化不完整实现的typeclass实例(的镜像)

和一些非常简单的类型类来测试它

sealed class FirstIs[M, T]
object FirstIs {
  implicit def firstIs[M, D]: FirstIs[M, (M, D)] = new FirstIs
}
如果我尝试通过alias部分应用
FirstIs
,并通过
LiftAll1

type FirstIsInt[D] = FirstIs[Int, D]
implicitly[LiftAll1[FirstIsInt, Unit]]
但内联部分类型应用程序会导致编译错误

implicitly[LiftAll1[({type lambda[x] = FirstIs[Int, x]})#lambda, Unit]]
//Error: could not find implicit value for parameter e: LiftAll1[[x]FirstIs[Int,x],Unit]

在这种情况下,如何找到部分应用的类型类?

正如@reactormank所建议的,编译器在
build.sbt

scalacOptions += "-Ypartial-unification"
在那段原始代码之后

import shapeless._, ops.hlist._

LiftAll[FirstIs[Int, ?], HNil]
已成功编译


一个AIK问题是scala编译器无法在没有直接类型别名的情况下将所提供的
隐式定义中的
FirstIs[Int,
理解为
F[\u]
。幸运的是,这在最新的scala实现中得到了修复。

正如@Reactormonk所建议的,编译器在
build.sbt

scalacOptions += "-Ypartial-unification"
在那段原始代码之后

import shapeless._, ops.hlist._

LiftAll[FirstIs[Int, ?], HNil]
已成功编译


一个AIK问题是scala编译器无法在没有直接类型别名的情况下将所提供的
隐式定义中的
FirstIs[Int,
理解为
F[\u]
。幸运的是,这在最新的scala实现中得到了修复。

您是否在2.12或2.11 typelevel scala上使用了
-yppartial unification
?@reactormank不知怎的,我忘了在该项目中添加此选项。非常感谢。问题解决了。@Odomontois您应该回答问题并将其标记为正确。。。回答您自己的问题是完全可以接受的。您是在2.12或2.11 typelevel scala上使用
-Ypartial unification
?@reactormank不知为什么,我忘了在该项目中添加此选项。非常感谢。问题解决了。@Odomontois您应该回答问题并将其标记为正确。。。这样回答你自己的问题是完全可以接受的。