목차
개요
- 함수 중심 프로그래밍
- 함수의 계산으로 데이터를 처리
- 상태와 가변 데이터 대신 불변 데이터를 가지고 프로그래밍
- 요즘은 그래서 클래스도 불변 클래스 이런 것들이 있음
- 순수 함수 (Locality)
- 부작용이 없는 함수
- 해당 함수외에 영향을 주지 않는다.
- 부가적인 영향이 없고, 딱 해당 함수의 동작에만 영향이 있음
- 변경 불가능한 데이터
- 만약 바뀌어야 한다면, 변수를 복사해서 사용한다.
- 참조 투명성
- 바깥에 있는 것을 참조하더라도 영향을 주지 않는
- 부작용이 없는 함수
- Lazy Evaluation
print([2-1, 9/4, 3*7, 10+1])
- eagar evaluation
- 함수 호출전에 모든 인자 목록을 계산해놓음
- 다 계산해두고, 어딘가에 저장해둠
- lazy evaluation
- 실제함수 호출시 그 값이 필요할 때까지 계산하지 않는다.
- 해당 배열에 접근하기 전까지는 계산하지 않는다.
- 함수형 언어는 새로운 것을 계속 복사해서 사용하기 때문에 계속해서 메모리를 늘릴 수가 없음
- 이러한 것이 적용이되서, 복사해서 사용한다고 해도, 실제 선언된 부분에 찾아가서 접근할 때 뒤늦게 계산이 됨
- 혹은 해당 인스턴스의 값이 변경되었다면, 그때 복사를 수행함
- 이러한 방법을 copy on write라고 함
- 스위프트 Copy on write
- 익명 함수 vs 클로저
- 함수는 클로저의 일종
- 람다 계산식의 구현체
- 선언된 범위의 변수를 캡쳐해서 저장하고, 닫힘
- 일단 참조 캡쳐가 기본
- 그렇기 때문에 기본적으로 함수형 패러다임에서 원하는 방법은 아님.
- 클로저 안에서 사용하는 변수도 다 불변하게 복사해서 사용해야지!
- 근데 그게 현실적으로 어려운 부분도 있다는 것
- 재귀 호출
- 순수한 함수형 언어에서는 변화하는 값(반복문에서 i가 변화함)을 사용할 수 없기 때문에 재귀적으로 로직을 구현한다.
- 일급 함수, 고차함수
- 자동 메모리 관리
- Copy on write
- 타입 시스템(타입 추론)
- 이거 안해주면 컴파일러가 힘든 것
- 명시적으로 적어주는게 더 나을 수도