Programing

순수성과 참조 투명성

lottogame 2020. 12. 26. 09:27
반응형

순수성과 참조 투명성


용어가 다르게 정의 된 것처럼 보이지만 저는 항상 하나가 다른 것을 의미한다고 생각했습니다. 표현식이 참조 적으로 투명하지만 순수하지 않은 경우 또는 그 반대의 경우를 생각할 수 없습니다.

Wikipedia는 이러한 개념에 대해 별도의 기사를 유지하며 다음과 같이 말합니다.

에서 참고 투명성 :

식에 포함 된 모든 함수가 순수 함수이면 식은 참조 적으로 투명합니다. 또한 값이 삭제되고 부작용이 미미한 경우 일부 불순한 함수가 표현식에 포함될 수 있습니다.

에서 순수한 표현 :

순수 표현식을 구성하려면 순수 함수가 필요합니다. [...] 순수 표현식은 종종 참조 적으로 투명하다고합니다.

나는 이러한 진술이 혼란스러워 보인다. 소위 "불순한 함수"의 부작용 이 프로그램을 실질적으로 변경하지 않고 수행 할 수 없을 정도로 중요하지 않은 경우 (즉, 이러한 함수에 대한 호출을 해당 값으로 대체 ), 그것은 마치 순수했던 것과 같습니다. 1 위, 그렇지?

순수한 표현과 참조 적으로 투명한 표현의 차이점을 이해하는 더 간단한 방법이 있습니까? 차이가 있다면 그것을 명확하게 보여주는 표현 예를 주시면 감사하겠습니다.


내가 아는 세 명의 이론가를 한 자리에 모으면 적어도 두 명은 "참조 투명성"이라는 용어의 의미에 동의하지 않습니다. 그리고 제가 젊은 학생이었을 때, 제 멘토가 저에게 전문 문학만을 고려하더라도 "참조 적으로 투명하다"라는 문구는 적어도 세 가지 다른 의미로 사용된다는 것을 설명하는 논문을주었습니다. (안타깝게도 그 논문은 아직 스캔되지 않은 재 인쇄물 상자 어딘가에 있습니다. Google 학술 검색에서 검색했지만 성공하지 못했습니다.)

알려 드릴 수는 없지만 포기하라고 조언 할 수 있습니다 . 뾰족한 언어 이론가의 작은 간부조차도 그것이 의미하는 바에 동의 할 수 없기 때문에 "참조 적으로 투명하다"라는 용어는 유용하지 않습니다 . 그러니 사용하지 마십시오.


추신 : 프로그래밍 언어의 의미론과 관련된 주제에 대해 Wikipedia는 신뢰할 수 없습니다. 나는 그것을 고치려는 시도를 포기했다. Wikipedian 프로세스는 안정성과 정확성에 대한 변화와 대중적인 투표를 고려하는 것 같습니다.


모든 순수 함수는 반드시 참조 적으로 투명합니다. 정의에 따라 전달 된 것 이외의 다른 항목에 액세스 할 수 없기 때문에 결과는 인수에 의해 완전히 결정되어야합니다.

그러나 순수하지 않은 참조 적으로 투명한 함수를 가질 수 있습니다. 나는 int가 주어진 함수를 작성할 수 i있고 난수를 생성하고 그 자체 r에서 빼서 넣은 다음 반환합니다 . 분명히이 함수는 난수를 생성하기 때문에 불순합니다. 그러나 참조 적으로 투명합니다. 이 경우 예제는 어리 석고 인위적입니다. 그러나 예를 들어 Haskell에서 함수는 유형 이지만 내 함수는 부작용을 사용함을 나타내는 유형 입니다. 프로그래머들이 실제로 기능 referentially 투명한 것이 외부 증명 수단을 보장 할 수있는 경우, 그들은 사용 을 벗겨rsi - sida - > astupidIda -> IO aunsafePerformIOIO 유형에서 물러나십시오.


나는 여기서 내가 제공하는 대답이 다소 확실하지 않지만 분명히 누군가가 우리를 어떤 방향으로 가리킬 것입니다. :-)

"순도"는 일반적으로 "부작용이 없음"을 의미하는 것으로 간주됩니다. 평가에 부작용이 없으면 표현식이 순수하다고합니다. 그렇다면 부작용은 무엇입니까? 순전히 기능적인 언어에서 부작용은 단순한 베타 규칙을 따르지 않는 모든 것입니다 (함수 적용을 평가하는 규칙은 공식 매개 변수의 모든 자유 발생에 대해 실제 매개 변수를 대체하는 것과 동일합니다).

예를 들어, 선형 (또는 고유성,이 구별이 지금은 신경 쓰지 않아야 함)을 가진 기능적 언어에서 일부 (제어 된) 변형이 허용됩니다.

그래서 나는 우리가 "순도"와 "부작용"이 무엇인지 분류했다고 생각합니다.

참조 투명성 (당신이 인용 한 위키피디아 기사에 따르면)은 변수가 당면한 프로그램의 의미를 변경하지 않고 나타내는 표현 (약어, 약자)으로 대체 될 수 있음을 의미합니다 (btw, 이것은 또한 다루기 어려운 질문입니다. 여기서는 그렇게하지 않겠습니다). 따라서 "순도"와 "참조 투명도"는 실제로 다른 것입니다. "순도"는 일부 표현의 속성으로 대략 "실행시 부작용이 발생하지 않음"을 의미하는 반면 "참조 투명도"는 변수 및 표현과 관련된 속성입니다. 그것은 "변수는 그것이 나타내는 것으로 대체 될 수있다"를 의미하고 의미한다.

도움이 되었기를 바랍니다.


한 ACCU2015 강연의이 슬라이드 는 참조 투명성 주제에 대한 훌륭한 요약을 제공합니다.

슬라이드 중 하나에서 :

(a) 모든 하위 표현식이 값이 동일한 다른 것으로 대체 될 수 있고 (b) 주어진 컨텍스트 내에서 모든 표현식이 동일한 값을 산출하는 경우 언어는 참조 적으로 투명합니다.

예를 들어 계산을 프로그램 표준 출력에 기록하는 함수를 가질 수 있지만 (따라서 순수 함수가 아닙니다)이 함수에 대한 호출을 계산을 기록하지 않는 유사한 함수로 대체 할 수 있습니다. . 따라서이 함수에는 참조 투명성 속성이 있습니다. 그러나 ... 위의 정의는 슬라이드에서 강조하는 것처럼 표현이 아니라 언어에 관한 것입니다.

[...] 처음에는 순수했던 것과 똑같지 않나요?

우리가 가지고있는 정의에 따르면 그렇지 않습니다.

순수한 표현과 참조 적으로 투명한 표현의 차이점을 이해하는 더 간단한 방법이 있습니까?

위에서 언급 한 슬라이드를 시도해보십시오 .


John Mitchell이 ​​그의 저서 Concept in programming language에서 쓴 내용을 인용하겠습니다 . 나는 그것을 한 줄씩 기억하지 못하지만 그는 순수한 기능적 언어가 선언적 언어 테스트를 통과해야한다고 정의합니다.

"x1, ..., xn의 특정 감속 범위 내에서 변수 x1, ..., xn 만 포함하는 표현식 e의 모든 발생은 동일한 값을 갖습니다."

간단히 말해서, 다른 모든 사람들이 부작용이 없거나 부작용이 없다고 언급했듯이 (부작용이 "부족함").

언어학에서 이름이나 명사구는 포함 된 문장의 의미를 변경하지 않고 동일한 참조를 가진 다른 명사구로 대체 될 수있는 경우 참조 적으로 투명한 것으로 간주됩니다.

첫 번째 경우에는 유지되지만 두 번째 경우에는 너무 이상해집니다.

사례 1 : "월터가 새 차에 타는 걸 봤어요 ."

Walter가 Centro를 소유하고 있다면 주어진 문장에서 다음과 같이 대체 할 수 있습니다.

"나는 Walter가 그의 Centro에 들어가는 것을 보았다 "

첫 번째와는 반대로 :

사례 # 2 : 그는 그의 수염을 읽었 기 때문에 William Rufus 라고 불 렸습니다 .

Rufus는 다소 빨간색을 의미하고 참조는 영국의 William IV를 나타냅니다.

"그는 그의 수염 때문에 윌리엄 4 세라고 불렸다 ." 너무 어색해 보입니다.

전통적인 방식으로 말하면 프로그램의 의미를 변경하지 않고 프로그램의 어느 곳에서든 한 표현을 동일한 값의 다른 표현으로 바꿀 수 있다면 언어는 참조 적으로 투명합니다.

따라서 참조 투명성은 순수한 기능적 언어의 속성입니다. 프로그램에 부작용이없는 경우이 속성이 유지됩니다.

그러니 포기하는 것은 멋진 조언이지만,이 맥락에서 잘 보일 수도 있습니다.

참조 URL : https://stackoverflow.com/questions/4865616/purity-vs-referential-transparency

반응형