Debugging Sparrow

스칼라, 함수형 프로그래밍(2) - 스칼라 프로그램의 요소

2020/03/12 Scala 스칼라 함수형 프로그래밍 Functional Programming call-by-name call-by-value

Martin Odersky의 Functional Programming Principles in Scala 강의를 공부하며 정리했습니다.

Read-Eval-Print Loop (REPL)

https://www.scala-sbt.org/에서 sbt를 설치 후
sbt console을 통해 REPL을 시작할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
scala> 34 + 65
res0: Int = 99

scala> def radius = 10
radius: Int

scala> def pi = 3.14159
pi: Double

scala> radius * pi
res1: Double = 31.4159

파라미터

1
2
3
4
5
6
7
8
9
10
11
12
13
14
scala> def square(x: Double) = x * x
square: (x: Double)Double

scala> square(2)
res2: Double = 4.0

scala> square(5 + 4)
res3: Double = 81.0

scala> square(square(4))
res6: Double = 256.0

scala> def sumOfSqaures(x: Double, y: Double) = square(x) + square(y)
sumOfSqaures: (x: Double, y: Double)Double

함수 어플리케이션의 평가

  1. 모든 함수 인자(arguments)를 왼쪽에서 오른쪽으로 평가(evaualte)한다.
  2. 함수 어플리케이션을 우항의 함수로 대체한다.
  3. 2와 동시에 함수의 이전 파라미터를 인자로 대체한다.

예를 들어,

  1. sumOfSquares(3, 2+2)
  2. sumOfSquares(3, 4)
  3. square(3) + square(4) (우항의 함수로 대체, 파라미터 x,y를 인자 3,4로 대체)
  4. 3 * 3 + square(4) (반복)
  5. 9 + square(4)
  6. 9 + 4 * 4
  7. 9 + 16
  8. 25

이러한 표현식 평가 모델을 치환 모델(Substitution Model)이라고 한다.

치환 모델

  • 모든 평가가 표현식을 값으로 바꾸는 줄이는 아이디어
  • 모든 표현식에 사용될 수 있으며 사이드 이펙트가 없다.
  • 치환 모델은 람다 대수(λ-calculus)에서 공식화되어 함수형 프로그래밍의 기초를 제공한다.

또 하나 다른 전략은 함수 인자를 줄이지 않고 함수를 적용하는 것이다.
예를 들어,

  1. sumOfSquares(3, 2+2)
  2. square(3) + square(2+2)
  3. 3 * 3 + square(2+2)
  4. 9 + square(2+2)
  5. 9 + (2+2) * (2+2)
  6. 9 + 4 * (2+2)
  7. 9 + 4 * 4
  8. 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) - 프로그래밍 패러다임
CATALOG
  1. 1. Read-Eval-Print Loop (REPL)
  2. 2. 파라미터
  3. 3. 함수 어플리케이션의 평가
    1. 3.1. 치환 모델
    2. 3.2. Call-by-value, Call-by-name