for yield 첫번째 예시 다음 공부이다

http://knight76.tistory.com/entry/scala-for-%EB%AC%B8-yield



list에 for yield를 사용한 예시이다.


간단한 for 코드이다. if 문은 for에 존재할 수도 있고, for 문 블럭 안에 존재할 수 있다.

for {
i <- 1 to 4 //1,2,3,4
if i % 2 == 0
} print(i)
println

결과는 24이다.



그런데, 컬렉션(List)라면 상황이 좀 달라진다. 컬렉션으로 비슷하게 코딩하면 에러가 발생한다.


//  에러 : Error:(37, 3) '<-' expected but '}' found.
// for {
// i <- list
// i % 2 == 0
// } println(i)


다음처럼 바꿔야 잘 동작한다.

val list = List(1, 2, 3, 4)
for (i <- list) {
print(i)
}
println

결과는 다음과 같다.


1234




List에 for yield를 간단하게 사용할 수 있다.

print(for (i <- list) yield i * 2)
println

결과는 다음과 같다.


1234




여기에 if문을 추가한 코드이다. if문을 안에 넣을 수 있지만, for 문장에 포함시킬 수 있다.

for (i <- list) {
if (i % 2 == 0) print(i)
}
println

for (i <- list if i % 2 == 0) {
print(i)
}
println


결과는 동일하게 24이다.





for문은 내부적으로 sugar스럽게 사용할 수 있다. 이를 scala's for comprehension(for 내장, 오현석님이 이미 이렇게 번역하셔서;; )이라고 한다. 스칼라 컴파일러가 for 코드를 내부적으로 flatMap 또는 forEach로 변경됨을 의미하는 개념이라 할 수 있다. 



// scala's comprehension
println(for(x <- List(1) ; y <- List(1,2,3)) yield (x,y))
println(List(1).flatMap(x => List(1,2,3).map(y => (x,y))))



결과는 다음과 같다.


List((1,1), (1,2), (1,3))

List((1,1), (1,2), (1,3))




Posted by '김용환'
,