Debugging Sparrow

스칼라, 함수형 프로그래밍(1) - 프로그래밍 패러다임

2020/03/12 Scala 스칼라 함수형 프로그래밍 Functional Programming

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

프로그래밍 패러다임

프로그래밍의 기본적인 세 가지 패러다임

  • 명령형 프로그래밍
  • 함수형 프로그래밍
  • 논리형 프로그래밍

객체지향 프로그래밍은 세 가지 패러다임에 직교 관계로 세 가지 패러다임과 함께 할 수 있다.

명령형 프로그래밍

  • 변수를 조작
  • 할당
  • if-thgn-else, loops, break, continue, return 등의 제어 구조를 가짐

폰 노이만 구조의 명령 시퀀스를 보면 쉽게 이해할 수 있다.

변수 - 메모리 셀
변수 역참조 - 로드 명령
변수 할당 - 저장 명령
제어 구조 - 점프

함수형 프로그래밍

John Backus는 이러한 프로그램 구조를 글자 하나하나에 매칭시키고 싶지 않았고 더 큰 구조에서 사고하고 싶어했다. 그는 명령형 프로그래밍이 한계에 다다를 것이라고 주장하며 집합, 다형식, 기하도형, 문자열 문서 등과 같이 고수준의 추상화 정의를 위한 기술이 필요하다고 생각하였다.

이론(Theory)

  • 하나 혹은 그 이상의 데이터 타입
  • 이러한 타입들에 대한 동작
  • 값과 동작의 관계를 설명하는 법칙
    일반적으로 theory는 가변(Mutation)에 대해서는 다루지 않는다.

예를들어 다항식의 이론(Theory)에서

1
(a*x +b) + (c*x +d) = (a+c)*x + (b+d)

다항식이 동일함을 유지하면서 계수를 바꾸기 위한 연산자는 정의하지 않는다.

문자열을 예로 들어보자 ++을 문자열을 연결하는 연산자라고 할 때

1
(a ++ b) ++ c = a ++ (b ++ c)

에서 Theory에서는 문자열 원소의 값을 바꾸는 연산자는 정의하지 않는다. (자바와 같은 일부 언어에서는 문자열이 불변함을 유지하긴 한다.)

프로그래밍에서 수학 이론(Theory)를 따르기

  • 이론에서 가변은 허용되지 않으며
  • 가변은 이론에서 제공하는 유용한 법칙들을 파괴한다.

그러므로 새로운 스타일의 프로그래밍은

  • 햠수로 표현되는 연산자들을 위한 이론을 정의하는데 집중해야 한다.
  • 가변을 쓰지 않는다.
  • 함수를 추상화하고 함수 합성을 위한 방법들을 갖는다.

함수형 프로그래밍

엄격한(Restriced) 관점, 관대한(Wider) 관점

  • 엄격한 관점의 함수형 프로그래밍은 변수가 없고, 값 할당이 없고, 반복문, 명령형 제어 구조가 없다.
  • 관대한 관점의 함수형 프로그래밍은 프로그래밍에서 함수에 집중한다는 것이다.
  • 구체적으로 함수는 변수가 될 수 있고 생산되고 소비되며 합성될 수 있다.
  • 이러한 것들은 모든 프로그래밍 언어에서 가능하나 함수형 프로그래밍 언어에서 더욱 쉽게 가능하다.

함수형 프로그래밍 언어

함수형 프로그래밍 언어에서 함수는 일급 객체(first-class citizen)이다.

  • 함수는 함수 안을 포함해서 어디에서나 정의될 수 있다.
  • 다른 값과 같이 인자로 전달될 수 있고 결과로 리턴될 수 있다.
  • 그리고 변수들과 같이 함수를 더 큰 함수로 합성하는 연산자들도 있다.

엄격한 관점에서의 함수형 프로그래밍 언어

  • Pure Lisp, XSLT, XPath, Xquery, FP
  • Haskell (without I/O Monad or UnsafePerformIO)

관대한 관점에서의 함수형 프로그래밍 언어

  • Lisp, Scheme, Racket, Clojure
  • SML, Ocaml, F#
  • Haskell (full language)
  • Scala
  • Smalltalk, Ruby

왜 함수형 프로그래밍 인가?

함수형 프로그래밍은 다음의 이유들로 대중화 되고 있다.

end

Author: dbgsprw

Link: https://dbgsprw.github.io/2020/03/12/스칼라-함수형-프로그래밍/

Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.

< PreviousPost
스칼라, 함수형 프로그래밍(2) - 스칼라 프로그램의 요소
NextPost >
웹앱을 Nginx로 Dockerize 하기 (multi-stage build)
CATALOG
  1. 1. 프로그래밍 패러다임
    1. 1.1. 프로그래밍의 기본적인 세 가지 패러다임
    2. 1.2. 명령형 프로그래밍
    3. 1.3. 함수형 프로그래밍
      1. 1.3.1. 이론(Theory)
      2. 1.3.2. 프로그래밍에서 수학 이론(Theory)를 따르기
  2. 2. 함수형 프로그래밍
    1. 2.1. 엄격한(Restriced) 관점, 관대한(Wider) 관점
    2. 2.2. 함수형 프로그래밍 언어
      1. 2.2.1. 엄격한 관점에서의 함수형 프로그래밍 언어
      2. 2.2.2. 관대한 관점에서의 함수형 프로그래밍 언어
    3. 2.3. 왜 함수형 프로그래밍 인가?