일급함수: 일반값처럼 취급할 수 있는 함수
고차원 함수: 하나 이상의 동작을 수행하는 함수
커링: x와 y라는 두 인수를 받는 함수 f를 한개의 인수를 받는 g라는 함수로 대체하는 기법
함수형 메서드에서는 전역 자료구조나 인수로 전달된 구조를 갱신할 수 없다
→ 자료구조를 바꾼다면 같은 메서드를 두 번 호출했을 때 결과가 달라지면서 참조 투명성에 위배되고 인수를 결과로 단순하게 매핑할 수 있는 능력이 상실되기 떄문
함수형 프로그램에서 전역 자료구조를 변경하게 되면 버그를 유도할 수 있다 → 새로운 자료구조를 만드는 방식으로 해결해 나가야 한다
함수형 프로그램에서 트리에 새로운 노드를 추가하면 모든 사용자가 변경에 영향을 받는다
함수형 프로그램에서 새로운 트리를 만들고 업데이트 시 기존 트리를 갱신하는 것이 아니라 새로운 노드를 만든다
갱신을 수행할 때마다 논리적으로 새로운 자료구조를 만든 다음에 사용자에게 적절한 버전의 자료구조를 전달하는 것도 가능
무한재귀에 빠질 수 있고 병렬화를 할 수 있는 능력을 얻기 위해 스트림은 단 한 번만 소비할 수 있어서 재귀적으로 정의할 수 없다
호출될때마다 생성되는 게으른 리스트가 스트림의 연결고리 역할을 할 수 있다
하지만 게으른 자료구조는 효율성이 떨어질 수 있으니 적절하게 사용해야 한다
방문자 디자인 패턴으로 자료형을 언랩할 수 있다
특정 데이터 형식을 방문하는 알고리즘을 캡슐화하는 클래스를 따로 만들 수 있다
방문자 클래스는 지정된 데이터 형식의 인스턴스를 입력으로 받음 → 인스턴스의 모든 멤버에 접근
자바8은 패턴매칭을 지원하지 않지만 이를 지원하게 된다면 커다란 switch문이나 if-else문을 피할 수 있다
기억화: 메서드에 래퍼로 캐시를 추가하는 기법
래퍼가 호출되면 인수, 결과 쌍이 캐시에 존재하는지 먼저 확인
참조 투명성: 인수가 같다면 결과도 같아야 한다는 규칙
함수형 프로그래밍에서는 데이터가 변경되지 않으므로 같다는 의미는 ==이 아니라 구조적인 값이 같다는 것을 의미
둘 이상의 함수나 자료구조를 조합하는 기능