Я узнал, что спецификация spec scala поддерживает переменные типа привязки при выполнении соответствия шаблону типа:
Map(1 -> "one", 2 -> "two") match {
case l: Map[k, v] =>
// binds k to Int and v to String
// k and v are types as shown here:
val i: Iterator[Tuple2[k, v]] = l.iterator
println(i.mkString(", "))
}
Есть ли какие-нибудь причудливые вещи или практические вещи, которые я могу сделать с этим? Или переменные типа привязки полезны только для целей документирования типов?
Мне пришло в голову, что scala иногда нужны аннотации типа, такие как определение функции, поэтому я попытался:
def prepender(obj: Any) = obj match {
case xs: List[a] => (x: a) => x :: xs
case opt: Some[a] => (x: a) => x :: Nil
}
Но тогда тип возвращаемой функции является странным:
prepender: (obj: Any)a with a => List[Any] forSome { type a; type a }
scala> val p = prepender(List(1,2))
p: a with a => List[Any] forSome { type a; type a } = <function1>
scala> p(1)
<console>:10: error: type mismatch;
found : Int(1)
required: a(in value res7) with (some other)a(in value res7) where
type (some other)a(in value res7), type a(in value res7)