함수형 프로그래밍
date
Mar 22, 2024
slug
functional-programming
status
Published
tags
PL & Compiler
summary
type
Post
고차함수 - p28
함수형 프로그래밍의 핵심 목표 중 하나는 문제의 핵심에 도달하는 것
→ 언어로 개념을 간결하게 표현할 수 있어야 한다.
아래 코드처럼 고차 함수를 사용하여 수준 높은 추상화 작업을 수행할 수 있다.
map
flatten
Option
자료구조 예제에서 사용되는 고차 함수이다.
Some
인스턴스를 병합하고 None
을 버린다.flatMap
컬렉션을 매핑한 다음 평면화를 수행하는 고차 함수이다.
두 코드의 결과는 동일하며 설명한대로
map
이후에 flatten하는 작업을 flatMap
이 수행한다.foldLeft
시작 요소와 요소 쌍에 대해 정의된 이항 연산 수행
두 요소를 결합하는 데 사용되는 모든 연산을 컬렉션의 모든 요소에 적용하는 방법 - p195
filter
지연평가 - p29
대중적으로 사용되는 대부분 언어는 지연이 발생하지 않고 즉시 평가된다. → 함수가 호출되는 즉시 평가
지연 평가는 그 값을 실제로 사용하기 전까지 호출하지 않기 때문에 즉시 평가보다 적게 수행하는 경우가 많으며, 프로그램의 속도가 빨라질 수 있다.
범주론 - p50
todo
대상(Object)과 사상(morphism) - p54
todo
펑터 (Funtor)
todo
모노이드 (Monoid)
foldLeft
는 모노이드의 개념에서 파생된다. 모노이드가 있으면 foldLeft
를 구현할 수 있다. - p73result
, i
등 값이 지속적으로 변한다. - 상태가 변한다.
sumAll
은 모노이드를 사용하고 상태를 변경하지 않는 함수형 버전이다.고계 함수(fold, reduce 등)를 활용하여 간결하고 직관적인 코드를 만들 수 있었다.
자연 변환(Natural Transformation)
todo
모나드 (Monad)
todo
함수형 자료구조
Option 자료 구조
타입이 없음을 의미하는
null
, 이로 인해 발생하는 NullPointerException
이 발생하지 않게 하기 위해 Option
이라는 자료 구조를 만들었다. Option
에는 값이 존재할 때 Some
으로 감싸져 있으며, 값이 존재하지 않을 때 None
타입으로 처리한다. 또한 null
이 아닌 항상 타입(Some
or None
)이 존재하기 때문에 위에서 언급한 예외가 발생하지 않는다.Scala 외에도 Java, C# 등
null
을 유연하게 처리하기 위한 문법들을 제공하고 있다. - Optional
, Nullable
, ? 키워드
Either 자료 구조
Either는
Right
, Left
로 구분되어 상황에 맞는 동작을 분리할 수 있다.
Right
는 Option
의 Some
타입, Left
는 모든 타입을 래핑할 수 있는 Option
의 None
포지션이라고 생각하면 된다.Java의 Stream
불변 데이터의 파이프라인을 만들고 각 단계에서 해당 데이터를 변환하는 방법이다.
→ 데이터를 순환하면서 변수를 변경시키는 방식보다 오류 발생 가능성이 훨씬 낮다.
고차 함수를 사용하면 컬렉션을 반복하고 상태를 변경하는 것보다 값 컬렉션(value collection)을 간단하고 확실하게 처리할 수 있다. - p111
동시성 (Concurrency) - p135
상태의 변화가 없으면 시간을 무시할 수 있다. - 항상 같은 값임을 증명할 수 있기 때문에 신뢰할 수 있다.
예를 들어 2개의 서로 다른 쓰레드가 같은 공간을 공유하며, mutable한 값이라면 신뢰할 수 없다. - self-learning-cs