2014-12-23 7 views
1

Grr ... 나는 이것이 실제로 작동하지 않는 이유에 대해 궁금해하는 표에 머리를 세게 치고 있습니다. 어떤 사람들이 나를 계몽 해 주시겠습니까?scala에서 표현하기

type Occurrences = List[(Char, Int)] 

def generateSubsets(occ: Occurrences): Occurrences = { 
    if (occ.isEmpty) List() 
    else { 
     val firstChar = occ.head._1 
     val firstCharOcc: Int = occ.head._2 
     val comb = for(i <- (1 to firstCharOcc); sp <- generateSubsets(occ.tail)) 
          yield (firstChar, i)::sp 
     comb.toList 
    } 
} 

Eclipse는 표현의와 선을 강조하고 "값은 : (CHAR, INT)의 구성원이 아닙니다"라고 나에게 이야기한다 ...

을하지만이 수행 할 때

val occ = List(('a', 5), ('b', 3), ('l', 2)) 

val t = ('m', 4)::occ 

모든 것이 원활하게 작동합니다.

답변

2

sp < - generateSubsets (occ.tail) 문 때문에 오류가 발생했습니다. generateSubsets는 생각했던 것처럼 List를 반환하지만 sp에 "할당"하면 sp는 각 반복 동안 실제로 (Char, Int) 인스턴스입니다. 따라서 ('a', 5) :: ('b', 3)와 같기 때문에 ('a', 5) :: sp를 가질 수 없습니다. 이 간단한 코드를

def test() = { 
    val i = 3 
    val occ = List(('a', 1), ('b', 2)) 
    for(i <- (1 to i); sp <- (occ)) 
     println(i, sp) 
    } 

    test() 

을 시도하고 당신이 generateSubsets에 의해 반환 된 튜플의리스트를 변수 sp wtih 반복 for(i <- (1 to firstCharOcc); sp <- generateSubsets(occ.tail))이 줄에 결과

+0

감사합니다. Gennadiy! –

1

볼에 당신이 무슨 일을 이해하는 데 도움이됩니다. 따라서 유형도 (Char, Int)입니다. for 반복 끝에 두 개의 튜플 (Char, Int)을이 튜플의 멤버가 아닌 :: 메서드 목록에 결합하십시오.