совпадение со списком скала - PullRequest
6 голосов
/ 27 августа 2010
List(1,2) match {
  case List(1,_) => println("1 in postion 1")
  case _ => println("default")
}

компилируется / работает нормально.Так что

List(1) match ...
List(3,4,5) match ...

но не

List() match ...

, что приводит к следующей ошибке

found : Int(1)
required : Nothing
             case List(1,_) => println("1 in postion 1")

Почему List () пытается сопоставить List (1, _)

Ответы [ 3 ]

12 голосов
/ 27 августа 2010

List() имеет тип List[Nothing]. Если вы используете List[Int](), это будет работать так, как вы ожидаете.

(Как правило, типы являются настолько ограничительными, насколько это возможно; поскольку вы создали список, в котором ничего нет, вместо Int, как вы и предполагали, используется наиболее ограничивающий возможный тип Nothing.)

6 голосов
/ 27 августа 2010

Когда вы пишете List(), выводимый тип - Nothing, который является подтипом ко всему.

В результате Scala выдает ошибку, когда вы пытаетесь выполнить невозможные совпадения.Например, "abc" match { case 1 => } приведет к аналогичной ошибке.Аналогично, поскольку List(1, _) может быть определено статически, чтобы никогда не совпадать с List(), Scala выдает ошибку.

2 голосов
/ 27 августа 2010

Может быть потому что ...

scala> implicitly[List[Nothing] <:< List[Int]]
res3: <:<[List[Nothing],List[Int]] = <function1>

scala> implicitly[List[Int] <:< List[Nothing]]
<console>:6: error: could not find implicit value for parameter e:<:<[List[Int],List[Nothing]]
       implicitly[List[Int] <:< List[Nothing]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...