“작성하지 않았다”의 의미는 무엇입니까?


35

많은 텍스트, 특히 함수형 프로그래밍 텍스트는 특정 CS 개념이 "구성하지 않는다"고 주장합니다 . 잠금은 작성하지 않고 모나드는 작성하지 않습니다.

이 구절의 의미를 정확하게 파악하는 데 어려움을 겪고 있습니다. 컴포지션을 생각할 때 함수 컴포지션 또는 객체 집계 ( "상속적인 컴포지션보다 선호 컴포지션")를 생각하지만 사람들이 여기에서이를 사용하는 의미는 아닙니다.

누군가 위의 두 예와 같은 표현 (즉, 잠금과 모나드)에서이 구가 무엇을 의미하는지 설명 할 수 있습니까?


객체 집합보다는 기능 구성에 더 가깝습니다.
Andres F.

대략적으로 그리고 비공식적으로, 자물쇠를 사용하는 두 가지 별도의 물건이 있다면, 그것들을 서로 붙이기가 어렵습니다. (잠금의 경우 교착 상태를 도입하지 않고하기가 어렵습니다. 모나드의 경우 유형이 복잡해질 수 있습니다)
user253751

답변:


35

사람들이 말할 때 그들은 "작성"에 의해 정말 의미 "조립", 그리고 무슨 뜻인지, "X는 작성하지 않습니다" 무엇을 하고 어떻게 정확히 "X"가 무엇인지에 따라 매우 다를 수 있습니다 함께 넣어.

또한 "구성하지 않았다"고 말하면 약간 다른 것을 의미 할 수 있습니다.

  1. 두 개의 X를 모두 동시에 넣을 수는 없습니다.
  2. 두 개의 X를 함께 넣을 수 있지만 결과는 X가 아닐 수 있습니다 (IOW : X는 composition 아래에서 닫히지 않습니다 ).
  3. 두 개의 X를 함께 넣을 수는 있지만 결과 X는 예상 한대로 작동하지 않을 수 있습니다.

# 1의 예는 스캐너 / 렉서가있는 파서입니다. "스캐너 / 렉서가 작성하지 않았습니다"라는 문구가 들릴 수 있습니다. 사실이 아닙니다. 의미하는 것은 "별도의 렉싱 단계를 사용하는 파서는 작성하지 않습니다"입니다.

왜 파서를 작성하고 싶습니까? JetBrains, Eclipse Foundation, Microsoft 또는 Embarcadero와 같은 IDE 공급 업체이고 웹 프레임 워크 용 IDE를 구축하려고한다고 가정 해보십시오. 일반적인 웹 개발에서는 종종 언어를 혼합합니다. <script>ECMAScript를 포함하는 요소가 포함 된 HTML 파일이 있으며<style>CSS를 포함하는 요소. HTML, 일부 프로그래밍 언어 및 일부 템플릿 언어 메타 구문이 포함 된 템플릿 파일이 있습니다. "Python", "템플릿에 포함 된 Python", "CSS", "CSS 내의 HTML", "ECMASCript", "ECMAScript 내의 HTML", "HTML", "HTML 내의 다른 구문 강조 표시기를 작성하고 싶지 않습니다. 템플릿 등이 있습니다. Python 용 구문 형광펜, HTML 용, 템플릿 언어 용 구문 형광펜을 작성한 다음이 템플릿 구문을 템플릿 파일의 구문 형광펜으로 작성하려고합니다.

그러나, 어휘 분석기는 전체 파일을 토큰 스트림으로 파싱하는데, 이는 하나의 언어에만 해당됩니다. 다른 언어의 파서는 렉서가 전달한 토큰으로는 작동하지 않습니다. 예를 들어, 파이썬 파서는 일반적으로 렉서가 들여 쓰기를 추적하고 가짜 INDENTDEDENT토큰을 토큰 스트림에 주입하는 방식으로 작성 되므로, 파이썬의 구문이 실제로는 아니더라도 구문 분석기에 컨텍스트가없는 것을 허용합니다. 그러나 HTML 어휘 분석기는 HTML에서 의미가 없기 때문에 공백을 완전히 무시합니다.

그러나 단순히 문자를 읽는 스캐너리스 파서는 문자 스트림을 다른 파서로 전달하여 다시 전달할 수 있으므로 작성하기가 훨씬 쉽습니다.

# 2의 예는 SQL 쿼리가 포함 된 문자열입니다. 각 구문에 올바른 SQL 쿼리가있는 두 개의 문자열이있을 수 있지만 두 문자열을 연결하면 구문 적으로 올바른 SQL 쿼리가 아닐 수 있습니다. 우리가 같은 쿼리 대수가 이유의 ARel, 어떻게 구성한다.

잠금은 # 3의 예입니다. 잠금이있는 두 개의 프로그램이 있고이를 하나의 프로그램으로 결합한 경우 여전히 잠금이있는 프로그램이 있지만 두 개의 원래 프로그램이 완전히 정확하고 교착 상태와 경쟁이 없어도 결과 프로그램에 반드시이 기능이있는 것은 아닙니다. 재산. 올바른 잠금 사용법은 전체 프로그램의 전역 속성이며 프로그램을 작성할 때 유지되지 않는 속성입니다. 이것은 예를 들어, 트랜잭션, 위해, 다른 작성합니다. 트랜잭션을 올바르게 사용하는 프로그램은 다른 해당 프로그램으로 구성 될 수 있으며 트랜잭션을 올바르게 사용하는 결합 된 프로그램을 생성합니다.


1
다시 말해서, "구성하지 않는다"는 "반 그룹을 형성하지 않았다"(또는 약간 더 강력하게는 모노 이드)를 의미한다.
존 퍼디

나는 확실히 associtaivity의이 그래서 더 (I 약 그대로 삼초 - D 일 전 배운) 마그마처럼, 필요하지 않다
요 르그 W MITTAG

그러나 "잠금이 작성되지 않는다"고 말할 때 누군가에게 무슨 의미인지 물어 보면 "잠금이있는 올바른 동시 프로그램 세트와 컴포지션 작업이 마그마를 형성한다는 것을 의미합니다"라고 대답하지 않을 것입니다. .
Jörg W Mittag

물론이지 대체 문구. 나는 "평평한"구성의 느낌을 유지하기 위해 연관성이 필요하다는 것을 알고 있지만,이를 뒷받침하는 강력한 주장은 없습니다.
존 퍼디

20

조합 성은 프로그램 구성 요소를 쉽고 안정적으로 결합하여 더 큰 구성 요소와 더 복잡한 기능을 생성 할 수 있음을 의미합니다.

구성 요소의 구성 성을 높이는 데 도움이되는 몇 가지 사항 :

  1. dem 등식. dem 등원 함수는 동일한 매개 변수 값으로 여러 번 호출되는 경우 항상 동일한 출력 또는 부작용을 생성합니다. 함수 호출의 결과를 예측할 수 있기 때문에 구성 성이 향상됩니다.

  2. 참조 투명도. 참조 적으로 투명한 표현식은 항상 동일한 결과로 평가됩니다. 이렇게하면 동일한 식을 서로 대체 할 수 있고 잠금을 사용하지 않고 식을 서로 독립적으로 (즉, 다른 스레드에서) 계산할 수 있으므로 조합 성이 향상됩니다 .

  3. 불변성. 불변 객체의 상태는 일단 생성되면 변경할 수 없습니다. 이것은 어떤 기능이나 객체가 생성 된 후 객체의 상태를 변경했는지 걱정할 필요없이 객체의 안정적인 값에 의존 할 수 있기 때문에 구성 성을 향상시킵니다.

  4. 청정. 순수한 기능에는 부작용이 없습니다. 그것들은 입력과 출력 만 가지고있어 함수 외부의 무언가가 변경되었는지 여부에 대해 걱정하지 않고 한 함수의 출력을 다른 함수의 입력에 넣을 수 있기 때문에 더 작게 구성 할 수 있습니다.

잠금은 외부 상태이기 때문에 어떤 상태를 공유하는 두 가지 작업을 결합 할 때, 그리고 잠금 사용에 따른 복잡성과 관련된 모든 종류의 이유로 인해 의존해야하는 외부 요소이기 때문에 작성하지 않습니다.

"모노 드가 작곡하지 않는다"는 말은 나에게 의미가 없습니다. 모나드의 요점은 키보드 입력이나 화면 출력과 같은 상태 정보를 가져 와서보다 정교하고 수학적인 형태로 바꾸는 것입니다.


4
내 생각 stackoverflow.com/questions/7040844/...가 나는 모나드가 훨씬 더 작성 가능 잠금보다 동의하지만, 아마 수단을 "모나드가되지 작성 할"무엇을 설명하는 좋은 일을한다.
Ixrec

"참조 투명성"및 "순도"에 대한 글 머리 기호는 실제로 순도에 대한 두 가지 요구 사항입니다 . "참조 투명성"이라는 용어 는 잘 정의되어 있지 않기 때문에 피해야 합니다 .
BlueRaja-대니 Pflughoeft

1
모나드는 특정 연산이있는 대수 구조입니다. 마지막 단락에서 설명한 IO것은 키보드 입력과 같은 "상태 저장 작업"을 캡처 하는 유형입니다. IO실제로 유형의 값은 작성하지만 모나드 인 전체 유형 IO 입니다. 이 유형은 목록 유형과 같은 모나드 인 다른 유형과는 구성되지 않습니다. 즉, 우리는 체계적 유형 생성하지 수 IO . List같은 동작합니다 모두 IOList동시에합니다. 말이 돼? 잘 설명했는지 잘 모르겠습니다.
Tikhon Jelvis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.