Я обнаружил, что показал, что 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)