Martin Odersky의 Functional Programming Principles in Scala 강의를 공부하며 정리했습니다.
Read-Eval-Print Loop (REPL)
https://www.scala-sbt.org/에서 sbt를 설치 후
sbt console을 통해 REPL을 시작할 수 있다.
1 | scala> 34 + 65 |
파라미터
1 | scala> def square(x: Double) = x * x |
함수 어플리케이션의 평가
- 모든 함수 인자(arguments)를 왼쪽에서 오른쪽으로 평가(evaualte)한다.
- 함수 어플리케이션을 우항의 함수로 대체한다.
- 2와 동시에 함수의 이전 파라미터를 인자로 대체한다.
예를 들어,
- sumOfSquares(3, 2+2)
- sumOfSquares(3, 4)
- square(3) + square(4) (우항의 함수로 대체, 파라미터 x,y를 인자 3,4로 대체)
- 3 * 3 + square(4) (반복)
- 9 + square(4)
- 9 + 4 * 4
- 9 + 16
- 25
이러한 표현식 평가 모델을 치환 모델(Substitution Model)이라고 한다.
치환 모델
- 모든 평가가 표현식을 값으로 바꾸는 줄이는 아이디어
- 모든 표현식에 사용될 수 있으며 사이드 이펙트가 없다.
- 치환 모델은 람다 대수(λ-calculus)에서 공식화되어 함수형 프로그래밍의 기초를 제공한다.
또 하나 다른 전략은 함수 인자를 줄이지 않고 함수를 적용하는 것이다.
예를 들어,
- sumOfSquares(3, 2+2)
- square(3) + square(2+2)
- 3 * 3 + square(2+2)
- 9 + square(2+2)
- 9 + (2+2) * (2+2)
- 9 + 4 * (2+2)
- 9 + 4 * 4
- 25
Call-by-value, Call-by-name
위에 설명한 방식은 Call-by-value가 되고 두 번째 방식은 Call-by-name이 된다. 두 가지 방식 모두 최종 값은 같다.
Call-by-value는 모든 함수 인자가 한번만 평가 된다는 장점이 있다.
Call-by-name은 함수 바디에서 관련된 파라미터가 사용되지 않으면 함수 인자가 평가되지 않는다는 장점이 있다.
Author: dbgsprw
Link: https://dbgsprw.github.io/2020/03/12/스칼라-함수형-프로그래밍2/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.
< PreviousPost
스칼라, 함수형 프로그래밍(3) - 평가 전략과 종료(Evaluation Strategies and Termination)NextPost >
스칼라, 함수형 프로그래밍(1) - 프로그래밍 패러다임
스칼라, 함수형 프로그래밍(3) - 평가 전략과 종료(Evaluation Strategies and Termination)NextPost >
스칼라, 함수형 프로그래밍(1) - 프로그래밍 패러다임