게으름 때문에 (단동 제한 +1 & dagger;). 기본적으로 당신이
year = year + 1
말을하고 year
을 평가할 때, 하스켈 결과 공간을 절약하고 year
을보고 다음 때 동일한 결과를 다시 사용하려고합니다. 따라서 year + 1
이 year
을 평가하려고하면 year
의 코드는 실제로 입력되지 않습니다.
GHC에서 멀티 스레딩을 구현하려면 & ddagger;, 실제로 수행되는 것은 이미 평가되고있는 변수의 값을 얻으려고 할 때 현재 스레드를 차단하는 것입니다. 그런 다음 평가가 끝나면 차단 된 스레드의 실행을 다시 시작합니다. 이 경우 스레드는 자체적으로 수행중인 평가에서 차단되므로 교착 상태가 발생합니다.
대신
year() = year() + 1
다음 날 위해 스택 오버 플로우를 제공 않습니다
year()
를 실행 말한다면.
; 당신이 스택 오버 플로우를 산출, 컴파일러가 ()
매개 변수와 같은 Num a
사전 치료를 완벽하게 무료 타입 서명을
year :: Num a => a
year = year + 1
을 추가하는 경우 때문에 단사 사상 제한이 놀이에 온다. 이 경우 실제로 문제는 아니지만 중간 결과 캐싱은 실제 계산에서 큰 문제입니다. GHC 실제로 더 또한 스택 오버 플로우를 생성하지 않습니다
year() = let y = y + 1 in y
같은 생산, 사전에 걸쳐 내부 코드 추상화를 재귀 을 가하고있는 것처럼이 경우, 그것은 보인다.
& ddagger; 단일 스레드 모드 (GHC)와 코드 컴파일 GHC는 무한 루프를 검출하고 불평 결정 수단 <<loop>>
을 산출한다.
메모리 사용량을 확인하십시오. 그것은 최적화에 달려 있지만, 그것은 일어날 수있는 한 가지입니다. – luqui
출력은 무엇입니까? –
이 결과는 정의되지 않았다고 가정합니다. –