[haskell] Haskell의 “아무것도하지 않음”기능인 id가 많은 메모리를 소비하는 이유는 무엇입니까?

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의 메모리 만 차지합니다. 프로그램에서 메모리를 차지하지 않습니다.


답변