2017-04-07 1 views
0
val list1 = List(1, 1, 2, 3, 5,7,8,4) 
    def lastrecursive[A](ls :List[A]):A = ls match{ 
    case p :: Nil => p // what is the meaning of Nil 
    case _ :: tail => lastrecursive(tail) 
    case _ => throw new NoSuchElementException 
    } 

재귀 형식의 코드 ABOVE의 경우. 누구든지 우리가 왜 :: 및 case h 및 case tail 및 case _를 제공하는지 설명 할 수 있습니까? 목록 일치 패턴 작업 중.스칼라의 매치 패턴에서 대소 문자의 의미는 무엇입니까?

and for reversing a list 
    def reverseRecursive[A](ls: List[A]): List[A] = ls match { 
    case Nil  => Nil 
    case h :: tail => reverseRecursive(tail) ::: List(h) 
      } 

어떻게 이것이 ::: 목록 (h) 작동합니까?

답변

2

::는 목록을 구성하고 해체하는 데 사용됩니다. a :: b는 목록의 머리가 a (단일 요소)이고 꼬리가 b (목록)임을 의미합니다.

p :: Nil은 요소 p가 있고 꼬리가 빈 목록 (Nil) 인 경우를 의미합니다.

이 경우는 기본적으로 목록의 마지막 실제 요소를 찾습니다.

두 번째 경우는 비슷합니다. h :: 꼬리는 요소 h와 목록 꼬리를 의미합니다. 그래서 우리는 꼬리를 뒤집은 다음 마지막에 h의 목록을 추가합니다 (l1 ::: l2는 목록 l1을 리스트 l 앞에 붙입니다).

+2

음 ... 나는이 경우에'operator' 대신'method'라는 단어를 사용하는 것이 더 좋을 것이라고 믿습니다. 그리고'::'는 목록을 구성하거나 분해하는 데 사용되지 않습니다. 'List'에 엘리먼트를'prepend '하는 것은'right associative' 메소드입니다. 'p :: Nil'을 볼 때,'Nil'은'p'가 앞에 붙는 빈리스트입니다. –

+1

@SarveshKumarSingh. 당신은 정확합니다 - 업데이트되었습니다. –

+0

'operator'는 매우 표준적인 의미를 지닌 매우 표준적인 단어입니다. 그리고 "비영 숫자 이름을 가진 메소드의 이름"이 아닙니다. 스칼라에 대해 말할 때'연산자 '라는 단어를 사용하지 말 것을 제안합니다. –

관련 문제