우리 모두는 Haskell이 기본적으로 게으르다는 것을 알고 있습니다 (또는 알아야합니다). 평가할 때까지 아무것도 평가되지 않습니다. 그렇다면 언제 무언가를 평가해야합니까? Haskell이 엄격해야하는 점이 있습니다. 이 특정 용어가 내가 생각했던 것만 큼 널리 퍼지지는 않았지만 나는 이것을 "엄격 점"이라고 부른다. 나에 따라:
Haskell의 감소 (또는 평가) 는 엄격 성 지점 에서만 발생합니다.
질문은 그래서 : 무엇을 정확하게 , 하스켈의 엄격 포인트입니까? 내 직감에 따르면 main
, seq
/ 뱅 패턴, 패턴 매칭 및을 IO
통해 수행되는 모든 작업 main
이 주요 엄격 점이지만 그 이유를 실제로 알지 못합니다.
(그들은 "엄격 포인트"라고하지 않는 경우 또한, 무엇 이다 그들이라고?)
좋은 대답에는 WHNF 등에 대한 토론이 포함될 것이라고 생각합니다. 나는 또한 람다 미적분에 영향을 미칠 것이라고 상상합니다.
편집 :이 질문에 대한 추가 생각.
이 질문에 대해 생각해 보았을 때 엄격 점의 정의에 무언가를 추가하는 것이 더 분명하다고 생각합니다. Strictness points는 다양한 컨텍스트 와 다양한 깊이 (또는 엄격함)를 가질 수 있습니다 . "하스켈에서의 감소는 엄격 성 지점에서만 발생한다"라는 저의 정의로 돌아가서,이 정의에 다음 절을 추가하겠습니다. "엄격 성 지점은 주변 컨텍스트가 평가되거나 축소 될 때만 트리거됩니다."
그래서 제가 원하는 종류의 답변을 시작하도록하겠습니다. main
엄격한 포인트입니다. 특히 문맥의 주요 엄격 점 인 프로그램으로 지정됩니다. 프로그램 ( main
의 컨텍스트)이 평가되면 main의 엄격 성 포인트가 활성화됩니다. Main의 깊이는 최대이며 완전히 평가되어야합니다. Main은 일반적으로 IO 작업으로 구성되며, 이는 컨텍스트가 main
.
이제 시도해보십시오. seq
이러한 용어에 대해 논의 하고 패턴 매칭을 수행하십시오. 함수 적용의 뉘앙스를 설명하십시오 : 얼마나 엄격합니까? 어때요? 어때 deepseq
? let
및 case
진술? unsafePerformIO
? Debug.Trace
? 최상위 수준 정의? 엄격한 데이터 유형? 뱅 패턴? Etc. 이러한 항목 중 몇 개를 시퀀스 또는 패턴 매칭으로 설명 할 수 있습니까?
seq
및 패턴 매칭이 충분하다고 생각 하며 나머지는 그것들과 관련하여 정의됩니다.IO
예를 들어 패턴 매칭은 행동 의 척추 엄격함을 보장한다고 생각 합니다.