2017-03-14 14 views
1

False 또는 값 목록을 반환하는 재귀 함수를 작성하고 있습니다. value head is not a member of Either[List[Char],Boolean]을하지만, 머리 방법은 목록을 매칭 한 후 사용해야합니다스칼라 재귀 함수 반환 중 하나가

def parse(chars: List[Char]): Either[List[Char], Boolean] = { 
    if (chars.length == 1) 
    chars 
    else { 
    val head = chars.head 
    val tail = parse(chars.tail) 
    tail match { 
     case Left(l) => { 
     if (are_equal(head, tail.head)) 
      head :: tail 
     else if (are_cancelled(head, tail.head)) 
      tail.tail 
     else 
      false 
     } 
     case Right(b) => false 
    } 
    } 
} 

나는 오류를 받고 있어요.

답변

3

일치하는 패턴 tail match { ... }은 일치하는 값의 유형을 마술처럼 변경하지 않습니다. tail은 여전히 ​​Either이고 Either에는 head 회원이 없습니다. 그러나 la이므로 tail.headl.head으로 바꿉니다.

명시적인 유형 주석을 삽입하면 더 명확하게 처리 할 수 ​​있습니다.

반환 유형도 몇 군데에서 잘못되었습니다. 컴파일에 더 가까운 버전이 있습니다 :

def parse(chars: List[Char]): Either[List[Char], Boolean] = { 
    if (chars.length == 1) { 
    Left(chars) 
    } else { 
    val head = chars.head 
    val tail = parse(chars.tail) 
    tail match { 
     case Left(l) => 
     if (are_equal(head, l.head)) 
      Left(head :: l) 
     else if (are_cancelled(head, l.head)) 
      Left(l.tail) 
     else 
      Right(false) 
     case Right(b) => Right(false) 
    } 
    } 
}