и вам не нужен тип шаблона.

спецификацию, я узнал, что 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)

Ответы на вопрос(1)

Ваш ответ на вопрос