2016-03-04 3 views
0

Я пытаюсь получить первый и последний элемент от и List от Int s. Вот что я пытаюсь в настоящее время:Scala соответствующий список

def find(lista: List[Integer]) : (Int,Int) = { 
    case (x) => (x,x) 
    case (x1,x2) => (x2,x2) 
    case hd :: _ :: tail => find(tail) 
} 

Я получаю предупреждение в строке find(tail):

type mismatching found List[Any], required List[Integer] 
+0

Какова точная ошибка вы получаете? Это «MatchError»? Пожалуйста, уточните свой вопрос. – Eric

+1

Кроме того, если это не учебное упражнение, почему бы не попробовать '(lista.head, lista.last)'? – Eric

+0

Я знаю, что возможно, я просто хочу это сделать без этого lol – miechooy

ответ

2

Это потому, что вы пропустили match в вашем коде то это должно быть,

def find(lista: List[Int]): (Int, Int) = lista match { 
    //cases go here 
} 

Вы также получили некоторые проблемы экстрактор (кортежи ДОН «т матч List) поэтому первые несколько заявлений дело должно быть,

{ 
    case h :: Nil => (h, h) 
    case h1 :: h2 :: Nil => (h1, h2) 
    ... 
} 

Что вы Фактически сделано в отсутствие match сделано scala конвертировать PartialFunction в Function. Причина, по которой он вводил тип ввода в Any, состоит в том, что первые два оператора case соответствовали кортежам, а не List, поэтому он расширил тип до Any.

Окончательный код,

def find(lista: List[Int]) : (Int,Int) = lista match { 
    case h :: Nil => (h, h) 
    case h1 :: h2 :: Nil => (h1, h2) 
    case hd :: _ :: tail => find(tail) 
} 
+0

:) find (List (1,2,3,4)) == (3,4); find (List (1,2,3)) == (3,3); find (List (1,2)) == (1,2) – nikiforo

+0

@nikiforo Вы правы - я действительно не удосужился прочитать фактическую точку функции, просто переведя написанное. – yw3410

2

Здесь совпадают с кортежем:

case (x1,x2) => (x2,x2) 

Если вы хотите играть с рекурсией и совпадением рисунков вы можете сделать что-л. как:

object HeadTail{ 
    def find(lista: List[Int]) : (Int,Int) = { 
    @tailrec 
    def getLast(l: List[Int]): Int = l match { 
     case h :: Nil => h 
     case h :: tail => getLast(tail) 
    } 

    lista match { 
     case Nil => throw new IllegalArgumentException("empty list") 
     case h :: tail => (h, getLast(lista)) 
    } 
    } 
} 

Вот как это работает:

scala> stackoverflow.q35804673.HeadTail.find(List(1,2,3,4,5)) 
res0: (Int, Int) = (1,5) 

scala> stackoverflow.q35804673.HeadTail.find(List(1,5)) 
res1: (Int, Int) = (1,5) 

scala> stackoverflow.q35804673.HeadTail.find(List(1)) 
res2: (Int, Int) = (1,1) 

scala> stackoverflow.q35804673.HeadTail.find(List.empty) 
java.lang.IllegalArgumentException: empty list 
Смежные вопросы