함수형 프로그래밍에는 다양한 기술이 포함됩니다. 일부 기술은 부작용이 있습니다. 그러나 중요한 측면은 방정식 추론입니다 . 같은 값으로 함수를 호출하면 항상 같은 결과를 얻습니다. 따라서 함수 호출을 반환 값으로 대체하고 동등한 동작을 얻을 수 있습니다. 이를 통해 특히 디버깅 할 때 프로그램에 대해 추론하기가 더 쉬워집니다.
함수에 부작용이 있다면, 이것은 잘 유지되지 않습니다. 반환 값에는 부작용이 없으므로 반환 값은 함수 호출과 동일하지 않습니다.
용액의 사용을 중지하는 쪽 효과 이러한 효과 인코딩 리턴 값을 . 언어마다 효과 시스템이 다릅니다. 예를 들어 Haskell은 모나드를 사용하여 IO 또는 상태 돌연변이와 같은 특정 효과를 인코딩합니다. C / C ++ / Rust 언어에는 일부 값의 돌연변이를 허용하지 않는 유형 시스템이 있습니다.
명령형 언어에서 print("foo")
함수는 무언가를 인쇄하고 아무것도 반환하지 않습니다. Haskell과 같은 순수 기능 언어에서 print
함수는 외부 세계의 상태를 나타내는 객체를 가져 와서이 출력을 수행 한 후 상태를 나타내는 새 객체를 반환합니다. 와 비슷한 것 newState = print "foo" oldState
입니다. 이전 상태에서 원하는만큼 새 상태를 만들 수 있습니다. 그러나 기본 기능에는 하나만 사용됩니다. 따라서 함수를 연결하여 여러 작업의 상태를 시퀀싱해야합니다. 인쇄하려면 foo bar
다음과 같이 말할 수 있습니다 print "bar" (print "foo" originalState)
.
출력 상태가 사용되지 않으면 Haskell은 게으른 언어이므로 해당 상태로 이어지는 작업을 수행하지 않습니다. 반대로이 게으름은 모든 효과가 명시 적으로 반환 값으로 인코딩되기 때문에 가능합니다.
Haskell 은이 경로를 사용 하는 유일한 통용 언어입니다. 기타 기능 언어 포함 Lisp 계열, ML 계열 및 Scala와 같은 최신 기능 언어는 낙관적이지만 여전히 부작용을 허용합니다. 명령형 기능 언어라고 할 수 있습니다.
I / O에 대한 부작용을 사용하는 것이 좋습니다. 종종 I / O (로깅 제외)는 시스템의 외부 경계에서만 수행됩니다. 비즈니스 논리 내에서 외부 통신이 발생하지 않습니다. 그러면 외부 쉘에서 여전히 불완전한 I / O를 수행하면서 소프트웨어의 핵심을 순수한 스타일로 작성할 수 있습니다. 이것은 또한 핵심이 무국적 일 수 있음을 의미합니다.
상태 비 저장은 합리성 및 확장 성 향상과 같은 여러 가지 실질적인 이점이 있습니다. 이것은 웹 애플리케이션 백엔드에 매우 인기가 있습니다. 모든 상태는 공유 데이터베이스에서 외부로 유지됩니다. 이렇게하면로드 밸런싱이 쉬워집니다. 세션을 특정 서버에 고정시킬 필요가 없습니다. 서버가 더 필요한 경우 어떻게합니까? 동일한 데이터베이스를 사용하고 있으므로 다른 것을 추가하십시오. 하나의 서버가 충돌하면 어떻게됩니까? 다른 서버에서 보류중인 요청을 다시 실행할 수 있습니다. 물론 데이터베이스에는 여전히 상태가 있습니다. 그러나 나는 그것을 명시 적으로 만들고 추출했으며, 원한다면 내부적으로 순수한 기능적 접근 방식을 사용할 수 있습니다.