Martin Odersky의 Functional Programming Principles in Scala 강의를 공부하며 정리했습니다.
Call-by-name, Call-by-value and Termination
Call-by-name과 Call-by-value가 표현식이 종료될 수 있다면 표현식을 똑같은 값으로 줄인다는 것을 알고 있다. 하지만 종료되지 않는다면 어떻게 될까? 중요한 정리중 하나는 다음과 같다.
- Call-by-value이 종료될 수 있다면, Call-by-name 또한 종료될 수 있다.
- Call-by-name이 종료된다고 Call-by-value가 종료되는 것은 아니다.
아래는 예시이다.1
2
3
4
5
6scala> def loop: Int = loop
scala> def first(x: Int, y: Int) = x // Call-by-value
scala> first(1, loop) // loop forever
scala> def first(x: => Int, y: => Int) = x // Call-by -name
scala> first(1, loop)
res0: Int = 1
위의 함수가 있을 때
스칼라에서는 기본적으로 call-by-value를 사용한다. 만약에 Call-by-name을 하고 싶다면 => 과 같이 표현한다. Call-by-name이 종료가 잘 되는 장점이 있는데도 Call-by-value를 기본적으로 쓰는 이유는 인수를 반복적으로 계산하지 않아 효율적이기 때문이다.
Author: dbgsprw
Link: https://dbgsprw.github.io/2020/03/12/스칼라-함수형-프로그래밍3/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.