为什么此类型约束对于列表 [seq[anyVal 或字符串]] 失败



我正在自己学习Scala,并遇到了这个问题。继 Link 的出色答案之后,假设我有以下代码:

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")))
}

但是,这失败了。错误消息是:

找不到参数 ev: conusviz 的隐式值。example.or[any =:= int,any =:= string]

我的问题是,为什么会这样?我只是将编译器应该能够推断出的另一种类型包装在一起。有没有办法让它工作?

我想让函数获取 Int (或 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)

相关内容

  • 没有找到相关文章

最新更新