본문 바로가기

학교 공부/프로그래밍원리

PART 1 - Functional Programming with Function Applications (2)

 

 

이 포스팅은 3차시 내용에 관한 것이다

이제부터 살짝 헷갈릴 예정

복습을 많이 해야하는 부분이다

 

 

 

Evaluation Strategy : Call-by-name , Call-by-value

▶  Call-by-value (cbv)

value로 call을 한다는 의미이니 value로 먼저 계산을 다 하고 나서 치환된다.

정확한 설명은

Evaluete the arguments first, then apply the function to them.

이라고 되어있다.

 

 

▶ call-by-name (cbn)

위에서 콜바이밸류는 이름값을 한다. value로 소환하니까.. 

근데 이건 교수님이 왜 name인지 모르겠다고 하셨다

call-by-expression이 더 직관적으로 와닿는다.

이건 함수 body에 그냥 expression을 넣는 것이다. 계산을 하지 않고 치환을 먼저 하는 것이다.

정확한 설명은

Just apply the function to its arguments, without evaluationg them.

이라고 되어있다.

 

 

def square(x:Int) = x*x

 

위의 코드로 두 가지 방식의 차이점을 살펴보자.

 

[cbv]

square(1+1) ~ square(2) ~ 2*2 ~ 4

 

[cbn]

square(1+1) ~ (1+1)*(1+1) ~ 2*(1+1) ~ 2*2 ~ 4

 

 

 

Q. 둘의 차이?

cbn은 함수에서 인자가 쓰이지 않으면 쓸데없는 인자계산이 이뤄지지 않는데, cbv는 함수에서 인자가 쓰이지 않아도 계산을 한다. => side effect가 발생한다고 한다.

 

 

 

둘의 차이에 대해서 더 자세히 다뤄보자

 

 

▶ CBV, CBN : Differences

▷ Call-by-value

 : Evaluates arguments once

 인자에 있는 expression을 한 번만 계산한다.

 

▷ Call-by-name

 : Do not evaluate unused arguments

 

 

 

Q. Do both always result in the same value?

-> 아니다. 둘의 결과가 다른 예시 코드를 보자.

 

def f(x) = 1
f(loop)

 

cbv는 loop를 계산하려고 계속 계산을 진행해서 결과를 출력하지 못하는 반면,

cbn은 바로 함수로 가니까 1을 출력해낸다.

 

만약 둘다 결과를 출력하는 상황이라면 같은 값을 출력하긴 한다.

 

 

 

 

 

그럼 우리가 배우는 스칼라는 어떤 방식으로 evaluation 하고 있을까?

스칼라는 Call-by-value를 default로 한다.

다만 "=>"를 통해서 Call-by-name으로 지정해줄수도 있다.

 

def one(x:Int, y: =>Int) = 1

//1
one(1+2, loop)

//2
one(loop, 1+2)

 

위에서 one 함수는 인자로 x, y를 가지는데, x는 cbv, y는 cbn이다.

첫번째 호출은 정상 작동하는 반면에

두번째 호출은 작동하지 않는다.

 

 

여기에서 코드 작성시 주의해야할 점이 있는데

y : => 에서 : 를 빼먹고 y =>라고 작성하면 에러가 난다.

 

슬라이드 필기를 첨부한다.

 

 

 

 

 

 

 

 

 

 

3차시 수업의 마지막 !!!

▶ Scala's  name  binding  strategy

▷ Call-by-value

"val"을 사용한다. (e.g. val x = e)

Evaluation the expression first, then bind the name to it

 

▷ Call-by-name

"def"를 이용한다. (e.g. def x = e)

Just bind the name to the expression, without evaluating it

Mostly used to define functions

(당연함. 함수를 정의하는데 정의하면서 parameter를 계산하는건 말이 안됨... )

 

 

def a = 1 + 2 + 3
val a = 1 + 2 + 3 //6

def b = loop // pass함
val b = loop //pass 못하고 무한루프... binding 못함
def f(a:Int, b:Int): Int = a*b -2

 

함수는 무조건 def로 정의해서 인자를 그대로 넘겨야된다. operand로 뭐가 올지 모르는데 val로 정의하게 되면 지금 당장 계산해야되니까 ..

 

 

 

 

 

 

 

 

 

다음 포스팅엔 조건문, 반복문 등등 다뤄볼 것이다.