본문 바로가기

Programming Project

(52)
[02]스칼라로 함수형 프로그래밍 시작하기 - 스칼라로 배우는 함수형 프로그래밍 2020/09/05 - [Programming Project/스칼라로 배우는 함수형 프로그래밍 정리] - [01]함수형 프로그래밍이란 무엇인가? - 스칼라로 배우는 함수형 프로그래밍 에서 이어지는 글입니다. 이 글은 스칼라로 배우는 함수형 프로그래밍을 읽고 정리한 글입니다. - 이번 글에서는 꼬리 재귀 함수(tail recursion function)를 이용해서 루프를 작성하는 방법을 알아 보며, 고차 함수(high-order-function)에 대해서도 알아본다. 고차 함수는 다른 함수를 인수로 받는 함수인데, 계산의 결과를 함수로 리턴 할 수도 있다. 또한 다형적(polymorphic) 고차 함수의 예도 몇 가지 소개한다. 2.1 스칼라 언어의 소개. 다음은 이번 장에서 자세히 살펴볼, 스칼라로 작성..
[01]함수형 프로그래밍이란 무엇인가? - 스칼라로 배우는 함수형 프로그래밍 스칼라로 배우는 함수형 프로그래밍을 읽고 정리한 글입니다. - 함수형 프로그래밍은 오직 순수 함수(pure function)들로만, 다시 말해서 부수 효과(side effect)가 없는 함수들로만 구축한다는 것이다. side effect가 없는 함수란, 어떤 값을 return하는 것 외에 다른 행위들(변수를 수정하거나, 오류를 내면서 실행을 중단하거나, 파일에서 무엇인가를 읽거나 수정하거나, 화면에 print를 한다거나..)을 발생시키지 않는 함수를 말한다. 이렇게 순수 함수들로만 프로그래밍을 하게 되면 모듈성(modularity)이 증가하여 훨씬 이로운 점들이 많이 생긴다. 모듈성 덕분에 순수 함수는 test, 재사용, 병렬화, 일반화, 분석이 쉬워진다. 또한, 버그가 생길 여지가 적다. 이 글에서는 ..
Lecture 2.1 - Higher-Order Functions (Functional Programming Principles in Scala / Coursera 강의 정리) 이 글에서는 functional programming에서 중요한 개념을 다른다. High order(고차) 함수는 함수를 인수로 전달하거나 결과로 반환할 수 있다. 함수형 언어에 대한 한가지 특별한 점은 함수형 언어는 함수를 1급 객체로 여긴다는 것이다. 이 말은, 다른 값 처럼 함수는 파라미터로 넘겨질 수 있고, result로 반환될 수도 있다는 말이다. 이것을 통해 프로그램을 작성할 수 있는 유연한 방법이 제공된다. 함수를 매개 변수로 가져오는 함수 또는 반환하는 함수는 고차 함수(high order function)라고 불린다. 이는 일차 함수(first order function)과 반대되는 말이다. 예시를 보자. a와 b 사이의 모든 정수를 합한다고 가정하자. sumInts는 범위를 입력으로 받..
Lecture 1.7 - Tail Recursion (Functional Programming Principles in Scala / Coursera 강의 정리) 지난번엔, 함수가 프로그램을 구성하는 기본적인 블록이라는것을 알게 되었다. 이번 글에서도 여전히 함수에 대해서 다뤄볼 것이다. 몇몇 방법을 통해 함수들을 구성하고, 합성하는 방법에 대해 알아보며, 마지막으로 다음 글에서 데이터와 객체에 대해 알아본다. 이번에는 재귀를 다시 살펴본다. 재귀를 표현하는 여러 방법이 있다는 것을 알게 될 것이다. 리뷰 할 겸 함수 application을 살펴보자. f(e1,...en)을 계산할 때에 있어서 다음의 규칙을 따른다. - e1~en을 먼저 계산한다. - 함수 f의 body로 application 부분을 대체한다. - 파라미터 v1,...,vn을 f의 파라미터로 바꾼다. 이것은 프로그램 자체를 다시 작성하는 것으로 형식화 될 수 있다. f(x1 , ... , xn)의..
Lecture 1.6(1-5 포함) - Blocks and Lexical Scope (Functional Programming Principles in Scala / Coursera 강의 정리) 1-5 강의는 실습 강의라서 간단하게 내용만 정리하여 대체하도록 하겠다. 요걸 만들려고 한다. 이를 구현하기 위해 위와 같은 방법을 사용하도록 한다. 이는 guess * guess = x가 되어야 하는 상황에서 guess = x / guess로 이항 한 후 현재 guess와 평균을 내어 근사화 시키는 과정이다. 요걸 만들어 놓고 요걸 실행하면 근사값을 구하게 된다. 그치만 sqrt에 너무 큰 수를 넣으면 너무 오랜 시간이 걸리게 된다. (원하는 정확도가 실질적인 수의 크기에 비해 너무 정밀하기 때문에) 그래서 1e50같은 수를 넣으면 너무 오래 걸려서 평가 지표를 아래와 같이 바꾼다. 이러면 수의 크기에 따라 대략적인 정밀도를 구하게 된다. ----이게 1.5 lecture전부--- 위의 프로그램들은 작..
Lecture 1.4 - Conditionals and Value Definitions (Functional Programming Principles in Scala / Coursera 강의 정리) 이번엔 두가지 선택 가능한 항목 중 하나를 선택할 수 있는 구문에 대해 (if , else와 같은) 소개하도록 하겠다. scala에서는 if else라는 statement가 있다. (java 조건문의 if else와는 조금 다르게 그냥 표현식이다) x >= 0 은 Boolean타입의 predicate(서술어)이라고 부른다. Boolean Expressions b의 경우 위와 같은 방식으로 만들어질 수 있다. boolean에 대한 규칙들. 합성과 변환 등에 대한 규칙이다. 이런 표현들을 'short-circuit evaluation'이라고 부른다. b에 대해서 if-else를 재 작성 해 보자. b가 true일 때 , false일 때에 대해서 위와 같이 두줄로 작성해볼 수 있다. 우리는 function p..
Lecture 1.3 - Evaluation Strategies and Termination (Functional Programming Principles in Scala / Coursera 강의 정리) 지난 시간에 표현식 모델을 평가하는 방법(치환 모델)에 대해 배워보았다. 이번 시간에는 좀더 깊이 (특히 종료의 관점에서)바라보도록 하자. 만약 종료가 된다면, 같은 값으로 변한다는 것을 알고 있다. 그럼 만약 연산이 종료가 안된다면 어떻게 될까? 여기서 중요한 정리가 하나 있는데, call-by-value 연산이 종료 될 수 있다면, call-by-name도 종료될 수 있다. 그렇지만 call-by-name이 종료된다고해서 call-by-value가 종료될 수 있다는 것은 아니다. 한번 CallbyName에선 종료되지만 CallByValue에선 종료되지 않는 예시를 보자. 여기에서 y가 무한 loop이라면 x만 계산하는 call-by-name에 반해서 call-by-value는 무한히 돌아갈 것이다. ..
Lecture 1.2 - Elements of Programming (Functional Programming Principles in Scala / Coursera 강의 정리) 함수형 프로그래밍에 대한 첫 단계를 시작한다. 대체(substitution) 모델이라고 부르는 평가를 위한 (기본적인) 모델이 있는데, 이는 나중의 세션에 중요하다. 주의하도록 하자. 자 이제 시작 해 보자. 모든 non-trivial(특수한? 중요한?) 언어는 언어의 기본적인 원소를 나타내는 원시(primitive) 표현식을 제공한다. 또한, 표현식을 결합하거나 추출하는 방법도 있다. 추출이란 표현식의 이름을 도입한 다음 그 이름을 기준으로 표현식을 참조할 수 있음을 의미한다. (Scala에 대한 맥락을 모른다면 이 문장을 아직은 바로 이해하기 힘들 수도 있다) 함수형 프로그래밍에 접근하는 한 가지 방법은, 함수형 프로그래밍을 계산기같이 바라보는 것이다. 실제로 대부분의 함수형 언어에는 interact..