람다 계산법의 근간이 되는 개념은 심볼의 값이 변경되지 않는다 는 것이다.
가변 변수를 사용하는 대신에 심볼에 값을 할당하면 그 값은 변경되지 않는다.
참조 투명성은 동일한 입력 값에 대해 항상 동일한 출력 값을 보장하는 특성을 말합니다. 이는 함수형 프로그래밍에서 매우 중요한 개념으로, 함수가 외부 상태에 의존하지 않고 전달받은 인자에만 의존해야 함을 의미합니다.
함수형 프로그래밍에서는 어떤 외부 상태에 의존하지도 않고 변경시키지도 않는, 즉 부수 효과(Side Effect)가 없는 함수를 순수함수(Pure function)이라고 한다. 즉, 동일한 입력이 주어지면 항상 동일한 출력을 반환하는 함수.
Context : Element? 나 클로저 ? 가될수도있는거같음.
Functor : 컨텍스트와 콘텐츠를 가지는 녀석들을 함수객체라고 한다. '추출할 수 있다'라는 표현을 사용할 수 있다면 함수객체라고 생각해도 무방할 것 같다.
Monad : 자신의 컨텍스트와 같은 컨텍스트의 형태로 맵핑할 수 있는 Functor
https://rriver2.tistory.com/entry/모나드란-with-Context-Functor
객체지향 프로그래밍과 함수형 프로그래밍을 대비해서 공통점과 차이점을 정리한다
불변인 객체의 장점은 해당 레퍼런스(포인터)를 가진 어떤 주체도 그 값이 영원히 바뀔 걱정 없이, 마음 놓고 믿고 쓸 수 있다는 뜻이다. 바뀌지 않으니 참조하는 순서(order)나 시점(time)을 고려할 필요가 없고, 그러니, 스레드 안전성(thread-safety) 문제도 고민할 필요가 없다는 뜻이다. 그리고 시점(time)에 따라 값이 변하는 것도 아니니, 실제값 내용은 확인할 필요 없이도, 레퍼런스의 포인터 값만 비교해서 같으면, 해당 값도 같다고 쉽고 빠르게 판단하는 잇점도 있다.
그러나 아쉬운 점은 그 값의 변화가 필요할 때, 원래 값을 바꿔서는 안 되므로, 값을 조금 바꾼 새로운 복사본을 만들어 내야 한다는 점이다. 이럴 때 가장 쉬운 방법은, 전체를 일일이 복사한 복사본을 만들면서 필요한 부분만 교체해서 만들어내는 방법인데, 이렇게 하면, 리스트에 단 하나의 요소를 추가하는데도 O(n)의 시간이 걸리는 데다, 메모리도 중복으로 낭비되는 문제가 있다.
그런 불변 자료구조의 단점을 해결하고자 영속(persistent) 자료 구조를 쓴다.
원래 버전의 자료 구조를 유지한 채 약간 변형된 새 버전을 만들어내면서 대부분의 원래 자료를 공유하는 형태의 자료 구조를 영속 자료 구조(persistent data structures)라고 한다.
그렇게 원래 자료 구조를 대부분 유지하고 일부만 살짝 바꾸고 원래 버전을 유지하므로, 연산 비용 측면이나 메모리 사용에 있어서 효과적인, 불변(immutable) 자료구조로 쓸 수 있다.
헤드에있는 부분을 붙이는데는
원래의 레퍼런스들을 원래 값으로 유지한 채 뒷부분에 엔트리가 추가된 리스트를 만들려면, 다시 전체를 복사해서 만들어야하고, 이는 O(n)연산이 된다
함수를 전달인자로 받거나, 함수를 리턴하는 함수
함수를 리턴하는 함수
고차함수나 커링함수의 장단점
장점
단점