сопоставление с образцом скалы - PullRequest
2 голосов
/ 08 августа 2011

Кажется, тип Nil не является полиморфным. Как мне исправить эту функцию:

scala> def last[A](a:List[A]) : A =   
     | a match {                      
     |   case _ :: tail  => last(tail)
     |   case Nil => Nil[A]           
     | }                              
<console>:8: error: object Nil does not take type parameters.
     case Nil => Nil[A]

UPDATE:

scala> def last[A](a : List[A] ) : Option[A] =
     | a match {                              
     |   case head :: Nil => Some(head)       
     |   case _ :: tail => last(tail)  
     |   case Nil => None                     
     | }                                      

Ответы [ 4 ]

4 голосов
/ 08 августа 2011

Nil это объект, а не тип. Так что Nil[A] не имеет никакого смысла.

Пустой список не имеет последнего элемента. Как таковой вызов last на Nil должен выдать ошибку.

def last[A](l: List[A]): A = l match {                      
  case x :: Nil => x
  case _ :: tail => last(tail)
  case Nil => sys.error("An empty list")
} 

В качестве альтернативы вы можете last вернуть Option[A], как показано ниже:

def last[A](l: List[A]): Option[A] = l match {                      
  case x :: Nil => Some(x)
  case _ :: tail => last(tail)
  case Nil => None
} 
1 голос
/ 08 августа 2011

Ошибка в том, что вы объявили метод возврата A:

def last[A](a:List[A]) : A
                        ^^^

и пустой список, Nil не является A.

(И (как примечание), как говорится в сообщении об ошибке, Nil не принимает параметры типа.)


Лучший тип возврата для функции last, вероятно, Option[A].Ваше определение метода, но с Option[A] будет выглядеть так:

scala> def last[A](a: List[A]): Option[A] =
     | a match {                           
     |     case x :: Nil => Some(x)        
     |     case _ :: tail => last(tail)    
     |     case Nil => None                
     | }                                   
last: [A](a: List[A])Option[A]
0 голосов
/ 08 августа 2011

Объект Nil расширяется List[Nothing]. Nothing является подтипом всего (похоже, что Any является супертипом всего), а List является ковариантным (обозначается как List[+A]), что означает, что Nil будет соответствовать в качестве конечной точки для каждый список.

Однако, в результате этой конструкции, существуют ситуации, когда компилятор не может определить правильный тип пустого списка, и вам нужно дать подсказку (как показано Беном Джеймсом). Кстати, то же самое относится к объекту None как подклассу Option.

0 голосов
/ 08 августа 2011

Когда вам нужно указать компилятору, какой тип Nil, вы можете использовать тип ascription, например:

Nil: List[A]

Но, как указал aioobe, это не решит вашу проблему,Nil - это пустой список, а не последний элемент списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...