본문 바로가기

Programming Project/FunctionalProgrammingPrinciples in Scala

Lecture 1.3 - Evaluation Strategies and Termination (Functional Programming Principles in Scala / Coursera 강의 정리)


투명한 기부를 하고싶다면 이 링크로 와보세요! 🥰 (클릭!)

바이낸스(₿) 수수료 평생 20% 할인받는 링크로 가입하기! 🔥 (클릭!)

지난 시간에 표현식 모델을 평가하는 방법(치환 모델)에 대해 배워보았다.

이번 시간에는 좀더 깊이 (특히 종료의 관점에서)바라보도록 하자.

 

만약 종료가 된다면, 같은 값으로 변한다는 것을 알고 있다. 그럼 만약 연산이 종료가 안된다면 어떻게 될까? 

여기서 중요한 정리가 하나 있는데, call-by-value 연산이 종료 될 수 있다면, call-by-name도 종료될 수 있다. 그렇지만 call-by-name이 종료된다고해서  call-by-value가 종료될 수 있다는 것은 아니다. 한번 CallbyName에선 종료되지만 CallByValue에선 종료되지 않는 예시를 보자.

 

여기에서 y가 무한 loop이라면 x만 계산하는 call-by-name에 반해서 call-by-value는 무한히 돌아갈 것이다.

 

스칼라에서는 일반적으로 call-by-value를 쓴다. 종료될 수 있는 장점이 있기 때문에 call-by-name를 써야 할 것 같아 보이지만 일반적으로는 call-by-value를 통한 계산이 더 효율적인 경우가 많기 떄문이다. (반복 계산 X , 명령형 프로그래밍에서 사이드 이펙트 관련 이슈 등등)

 

만약 너무 call by name으로 연산해주고 싶다면 => 을 사용 해 주면 (arrow int type) 위와 같은 상황에선 y는 int지만 call-by-name으로 넘겨진다는 뜻이 된다.

 

그럼 이런식으로 무한 loop을 피해갈 수 있게 된다.