2014-11-02 4 views
0

for 본문의 가장 안쪽에있는 결과를 List[Output]으로 수집하여 반환 할 수 있습니다. 하지만 yield을 사용하고 싶습니다. 이 방법은 for-yield 패턴을 사용하여로 변환 할 수있는 방법 :중첩 for 루프를 이해를 위해 변환

스칼라에서
def useForComprehension(input : Input): List[Output] = {   
    for (o <- splitInputIntoPieces(input)) { 
    for (restResults <- useForComprehension(subtract(input, o))) { 
     for (w <- f3(o)) { 
      yield w::restResults // !!!!! Error 
     } 
    }   
    }  
} 
+0

[예제가 잘못되었다고 생각하게하는 완전히 다른 오류가납니다] (http://scalafiddle.net/console/4e38d30e656da5ae9d3a425109ce9e04), 문제가 다른 것임을 나타내는 코드가 잘못되었다고 생각하게하거나 꽤 오래된 스칼라 버전입니다. 왜냐하면 최근의 스칼라 버전에서는 '{}'의'yield '를 가질 수 없기 때문입니다 (첫 번째 문장이어야합니다). –

+0

yield의 사용법을 배우고 있습니다. 위의 기능을 어떻게 수행 할 수 있습니까 (코드가 컴파일되지 않더라도 제 의도를 얻을 수 있습니까?)'yield '를 올바르게 사용합니까? –

+0

'yield {...}'{yield ...} '가 아니고 –

답변

1

, 중첩 된 반복은 추가 <- 절을 추가하여 처리됩니다.

예를 들어, 우리는 두 목록 l1l2을 가지고 우리가 xl1에 있으며 yl2에 어디 요소 (x,y)의 모든 쌍을 통해 생성한다고 가정 해 보자. 스칼라의 구문은 다음과 같습니다

for { x <- l1 
     y <- l2 
    } yield (x,y) 

yield 키워드가 입력 오류의 원인 Unit의 유형에 for 다음 전체 표현식의 결과를 다음과 없을 때. 이 함축하면 {} 수율을 둘러싼 때문에 What is Scala's yield?

+0

나는 그것을 이해한다. 나는 한 번''for''에'<-'를 결합하는 데 몇 번 시도했지만 실패했습니다. 내 코드를 변환 할 수 있습니까? –

+0

실패한 코드를 게시 할 수 있습니까? 아마도 그 질문에 빠져있는 다른 잘못된 것이있을 것입니다. – lea

0

귀하의 오류가있을 수 있습니다 참조에 대한 자세한 내용은 예를

for { x <- l1 
     y <- l2 
    } println((x,y)) 

를 들어, 반복에 부작용을 수행 할 때 유용합니다.

for {stuff} {yield otherstuff} 

양식은 다음과 같아야합니다

for {stuff} yield otherstuff 

당신은 물론 블록으로 "otherstuff"대체 할 수 있습니다 당신은 당신이 그래서 여러 표현을 포함 할 경우 :

for {stuff} yield {otherstuff} 

사용 귀하의 예를 들어 당신이 뭔가를 원하는 것 같습니다 :

def useForComprehension(input: Input): List[Output] = 
    for { 
    o <- splitInputIntoPieces(input) 
    restResults <- useForComprehension(subtract(input, o)) 
    w <- f3(o) 
    } yield w :: restResults