Haskell에는 입력을 변경하지 않고 반환하는 식별 함수가 있습니다. 정의는 간단합니다.
id :: a -> a
id x = x
따라서 재미를 위해 다음과 같이 출력되어야합니다 8
.
f = id id id id id id id id id id id id id id id id id id id id id id id id id id id
main = print $ f 8
몇 초 후 (작업 관리자에 따르면 약 2GB의 메모리) ghc: out of memory
. 마찬가지로 통역사는 ghci: out of memory
.
id
은 매우 간단한 함수 이기 때문에 런타임이나 컴파일 타임에 메모리 부담이 될 것으로 기대하지 않습니다. 사용중인 모든 메모리는 무엇입니까?
답변
우리는 id
,
id :: a -> a
그리고 우리가를 위해 이것을 전문화하면 id id
,의 왼쪽 사본은 다음과 id
같은 유형 을 갖습니다.
id :: (a -> a) -> (a -> a)
그런 다음에서 가장 왼쪽 id
에 대해 다시 전문화하면 다음과 같은 결과가 나타납니다 id id id
.
id :: ((a -> a) -> (a -> a)) -> ((a -> a) -> (a -> a))
따라서 각각 id
추가하는 것을 볼 수 있습니다. 맨 왼쪽의 유형 서명 id
은 두 배입니다.
유형은 컴파일 중에 삭제되므로 GHC의 메모리 만 차지합니다. 프로그램에서 메모리를 차지하지 않습니다.