이것은 이론적 인 질문이지만, 현재 C ++을 사용하여 "정상적인"명령 기법으로 수년간의 프로그래밍을 한 후, 다른 기능적 프로그래밍 세계를 발견했습니다. JavaScript를 우연히 배우면서 우연히 넘어졌습니다.
이것은 완전한 상태 지향 프로그램을 순수하게 기능하고 상태가없는 다른 구현으로 기술적으로 대체 할 수 있는지 궁금해했습니다.
흥미로운 아이디어이며, 함수형 프로그래밍에 분명하고 우아함이 있다는 사실을 인정해야합니다.
이것은 이론적 인 질문이지만, 현재 C ++을 사용하여 "정상적인"명령 기법으로 수년간의 프로그래밍을 한 후, 다른 기능적 프로그래밍 세계를 발견했습니다. JavaScript를 우연히 배우면서 우연히 넘어졌습니다.
이것은 완전한 상태 지향 프로그램을 순수하게 기능하고 상태가없는 다른 구현으로 기술적으로 대체 할 수 있는지 궁금해했습니다.
흥미로운 아이디어이며, 함수형 프로그래밍에 분명하고 우아함이 있다는 사실을 인정해야합니다.
답변:
짧은 대답 : 예. Wikipedia에 따르면, Alan Turing은 1937 년에 튜링 머신과 람다 미적분 의 계산이 보편적 인 계산 모델임을 보여 주었다. 튜링 머신의 계산 모델은 명령형 또는 스테이트 풀 프로그래밍에 대해 이야기 할 때 일반적으로 염두에두고 있으며 람다 미적분학은 "순수 함수형 프로그래밍"을 수학적으로 형식화 한 것입니다.
모든 효과적인 계산 모델은 튜링 머신과 동일한 계산을 수행 할 수 있으며 그 반대도 가능합니다. 이것을 교회 튜링 논문 이라고 합니다. 그러나이 계산은 "효과적인 계산 모델"이라는 다소 직관적 인 용어 때문에 입증 될 수 없습니다 (아마도 누군가가 미래에 새로운 모델을 발명 할 것입니까?)
어떤 역동적 인 시스템에서 "상태"는 당신의 현재가 과거 나 미래의 영향을받는 것 입니다.
"기억해야 할"것이 있거나 수행 한 작업에 따라 달라지는 상태가됩니다.
상태가없는 시스템은 "동적"이 아니라 결합 기능 일뿐입니다. 상태가 없을 수도 있지만 다른 결과를 생성하려면 어떻게 든 상태를 제공해야합니다.
이제 참조하는 계산 모델에 따라 상태를 명시 적으로 (변수 형식으로) 또는 내재적으로 ( "반환 주소"형식으로) 나타낼 수 있습니다.
당신이 fna(fnb(x))
할 때 당신은 fna에 대한 상태를 생성하는 fnb 상태를 제공하고 있습니다. 이것은 x
fnb가 호출되기 전에 존재하기 때문입니다 (따라서 자체 "과거"에서 나옵니다).
"국가 존재"또는 "국가가 존재하지 않음"의 문제는 아닙니다. 그것은 "나는 상관한다"또는 "나는 상관 없다"의 교인이다.
상태는 현재 자극에 기초한 것이 아니라 과거 자극에 의존하는 방식으로 현재 자극에 반응하는 능력을 의미합니다.
순전히 기능적인 프로그램은 기능 일뿐입니다. 따라서 실제 응용 프로그램의 경우 순수 기능 프로그램은 쌍 (old_state * present_stimulus)을 입력하고 쌍 (new_state * present_response)을 출력합니다. 다음 자극을 기다리고 상태를 전파하려면 외부의 상태 저장 "루퍼"가 필요합니다.
순전히 기능적인 프로그램은 본질적으로 상태를 갖지 않으며 실제 응용 프로그램에 직접 사용할 수 없습니다.
따라서 어떠한 상태 지향 프로그램은 순전히 기능적 상태없이 다른 구현으로 대체 될 수 없다.
외부 세계와 상호 작용할 필요가없는 한 명시적인 변경 가능한 상태를 피할 수 있습니다.
자바 스크립트에서 프로그램이 실제로 프로세서주기를 넘어서는 효과를 가지려면 Dom 또는 Window 객체를 수정해야하며 이러한 API는 상태 저장 상태입니다. 그러나 Dom 및 Window 객체를 매개 변수로 JavaScript 코드에 전달한 다음 새로운 Dom / Window를 출력으로받는 래퍼를 만들 수 있다고 가정합니다. 이것은 JavaScript 코드를 변경 가능한 상태에서 격리시킵니다.
물론 브라우저 창과 DOM은 본질적으로 상태가 풍부하기 때문에 여전히 상태에 의존하고 있습니다. 모든 대화 형 응용 프로그램은 기본적으로 상태 저장 기능이지만 명시 적 상태를 최소화하도록 코드를 구조화 할 수 있습니다.
다른 질문은 그것이 좋은 아이디어인지의 여부입니다. 설계 상 순수한 기능 언어 인 Haskell조차도 변경 가능한 상태를 시뮬레이션 할 수있는 '상태'모나드를 포함합니다. 이것은 명백한 변경 가능한 상태가 때때로 바람직한 패턴임을 보여줍니다.