Scala 定义自定义类型 - 类型不匹配错误

Scala Defining Custom Type - Type Mismatch Error

我正在做一个基本练习来理解 Scala 用户定义的类型。考虑以下示例:

type MyType[T <: AnyVal] = (List[Seq[T]], String, String)
val g: MyType = (List(Seq(1, 2), Seq(3, 4), (Seq(5, 6))), "foo", "bar")

编译失败,类型错误:

type MyType takes type parameters
[error]     val g: MyType = (List(Seq(1, 2), Seq(3, 4), (Seq(5, 6))), "foo", "bar")

然而,这编译:

type MyType[T <: AnyVal] = (List[Seq[T]], String, String)
val g: MyType[Int] = (List(Seq(1, 2), Seq(3, 4), (Seq(5, 6))), "foo", "bar")

有没有什么办法可以让Scala自动判断类型而不需要指定具体的参数类型?我知道对于功能我们可以执行以下操作:

import scala.reflect.ClassTag

def f1[T](lst: List[T])(implicit ev: ClassTag[T]) = {
  lst.toArray
}

在这种情况下,我不需要显式地调用 f1Int,我可以直接调用 f1(...) 就可以了。

你可以直接写

val g = (List(Seq(1, 2), Seq(3, 4), (Seq(5, 6))), "foo", "bar")

编译器会推断类型。您可以检查 g: MyType[Int] 编译。

你也可以

def TypeOf[F[_ <: AnyVal]] = new PartiallyAppllied[F]
class PartiallyAppllied[F[_ <: AnyVal]] {
  def apply[A <: AnyVal](fa: F[A]) = fa
}

val g = TypeOf[MyType]((List(Seq(1, 2), Seq(3, 4), (Seq(5, 6))), "foo", "bar"))

g: MyType[Int]