development

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

big-blog 2020. 7. 28. 07:31
반응형

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

참고 URL : https://stackoverflow.com/questions/23746852/why-does-haskells-do-nothing-function-id-consume-tons-of-memory

반응형