Использовать корпус и примеры для рисунков типа с переменной типа

Я обнаружил, что показал, что 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)
12
задан huynhjl 6 September 2011 в 14:25
поделиться