Nil
и ::
- это явно способы построения List
, но не все Seq
значения оказываются Lists
, поэтому можно ожидать, что средство проверки типа Scala отклонит эту программу как некорректно набранную,Правильно?
Неверно.Попробуйте это, и вы поймете, что я имею в виду:
def sum (list : Seq[Int]) : Int = list match {
case Nil => 0
case head :: tail => head + sum(tail)
case _ => -1
}
> sum(Array(1,2,3).toSeq)
res1: Int = -1
> sum(List(1,2,3))
res2: Int = 6
Итак, вы видите, некоторые Seq
uences могут быть в состоянии разобраться с Nil
и ::
, так что те, которые могут, будут.Те, кто не может, потерпят неудачу в сопоставлении с образцом и перейдут к следующему совпадению.Nil
и ::
достаточно, чтобы охватить все возможности для List
, но не для Seq
.Здесь есть компромисс между подтипом, удобством и безопасностью типов.Решение на данный момент: будьте более осторожны при рефакторинге.