为什么此类型约束对 List[Seq[AnyVal or String]] 失败
Why Does This Type Constraint Fail for List[Seq[AnyVal or String]]
我正在自学 Scala,并且 运行 对此感兴趣。继 的优秀答案之后,假设我有以下代码:
object Example extends App {
val x = Seq(1, 2, 3)
val y = Seq("1", "2", "3")
class Or[A, B]
implicit def orA[A, B](implicit ev: A): Or[A, B] = new Or
implicit def orB[A, B](implicit ev: B): Or[A, B] = new Or
def f1[T](seq: Seq[T])(implicit ev: Or[T =:= Int, T =:= String]) = {
println(seq)
}
f1(Seq(1, 2, 3))
f1(Seq("1", "2", "3"))
}
编译一切顺利。但现在让我们假设我更改函数,使其接受序列列表,而不仅仅是序列,然后尝试以下操作:
object Example extends App {
val x = Seq(1, 2, 3)
val y = Seq("1", "2", "3")
class Or[A, B]
implicit def orA[A, B](implicit ev: A): Or[A, B] = new Or
implicit def orB[A, B](implicit ev: B): Or[A, B] = new Or
def f1[T](seq: List[Seq[T]])(implicit ev: Or[T =:= Int, T =:= String]) = {
println(seq)
}
f1(List(Seq(1, 2, 3), Seq("1", "2", "3")))
}
然而,这失败了。错误信息是:
could not find implicit value for parameter ev: conusviz.Example.Or[Any =:= Int,Any =:= String]
我的问题是,为什么会这样?我只是包装了一些编译器应该能够推断出另一种类型的东西。有没有办法让它工作?
我想让函数获取 Int(或 Indeed AnyVal)或字符串的列表并且仍然有效。对于编译器为何感到困惑,我只是有点困惑。从学习的角度来看,对编码答案的任何解释都将不胜感激。
Seq(1, 2, 3)
的类型为 Seq[Int]
,Seq("1", "2", "3")
的类型为 Seq[String]
。 Seq[Int]
和 Seq[String]
都是 Seq[Any]
的子类型。所以 List(Seq(1, 2, 3), Seq("1", "2", "3"))
的类型是 List[Seq[Any]]
.
如果你想保留类型 Seq[Int]
和 Seq[String]
那么你不需要 List
但 HList
import shapeless.{HList, HNil}
import shapeless.ops.hlist.LiftAll
def f[L <: HList](seq: L)(implicit ev: LiftAll[({type l[T] = Or[T =:= Seq[Int], T =:= Seq[String]]})#l, L]) = {
println(seq)
}
f(Seq(1, 2, 3) :: Seq("1", "2", "3") :: HNil)
我正在自学 Scala,并且 运行 对此感兴趣。继
object Example extends App {
val x = Seq(1, 2, 3)
val y = Seq("1", "2", "3")
class Or[A, B]
implicit def orA[A, B](implicit ev: A): Or[A, B] = new Or
implicit def orB[A, B](implicit ev: B): Or[A, B] = new Or
def f1[T](seq: Seq[T])(implicit ev: Or[T =:= Int, T =:= String]) = {
println(seq)
}
f1(Seq(1, 2, 3))
f1(Seq("1", "2", "3"))
}
编译一切顺利。但现在让我们假设我更改函数,使其接受序列列表,而不仅仅是序列,然后尝试以下操作:
object Example extends App {
val x = Seq(1, 2, 3)
val y = Seq("1", "2", "3")
class Or[A, B]
implicit def orA[A, B](implicit ev: A): Or[A, B] = new Or
implicit def orB[A, B](implicit ev: B): Or[A, B] = new Or
def f1[T](seq: List[Seq[T]])(implicit ev: Or[T =:= Int, T =:= String]) = {
println(seq)
}
f1(List(Seq(1, 2, 3), Seq("1", "2", "3")))
}
然而,这失败了。错误信息是:
could not find implicit value for parameter ev: conusviz.Example.Or[Any =:= Int,Any =:= String]
我的问题是,为什么会这样?我只是包装了一些编译器应该能够推断出另一种类型的东西。有没有办法让它工作?
我想让函数获取 Int(或 Indeed AnyVal)或字符串的列表并且仍然有效。对于编译器为何感到困惑,我只是有点困惑。从学习的角度来看,对编码答案的任何解释都将不胜感激。
Seq(1, 2, 3)
的类型为 Seq[Int]
,Seq("1", "2", "3")
的类型为 Seq[String]
。 Seq[Int]
和 Seq[String]
都是 Seq[Any]
的子类型。所以 List(Seq(1, 2, 3), Seq("1", "2", "3"))
的类型是 List[Seq[Any]]
.
如果你想保留类型 Seq[Int]
和 Seq[String]
那么你不需要 List
但 HList
import shapeless.{HList, HNil}
import shapeless.ops.hlist.LiftAll
def f[L <: HList](seq: L)(implicit ev: LiftAll[({type l[T] = Or[T =:= Seq[Int], T =:= Seq[String]]})#l, L]) = {
println(seq)
}
f(Seq(1, 2, 3) :: Seq("1", "2", "3") :: HNil)