2014-05-19 15 views
108

Haskell ma funkcję identyfikacji, która zwraca dane wejściowe bez zmian. Definicja jest prosta:Dlaczego funkcja Haskella "nie rób nic", id, zużywa ton pamięci?

id :: a -> a 
id x = x 

Tak dla zabawy, to powinien wypisać 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 

Po kilku sekundach (i około 2 GB pamięci według Task Manager), kompilacja nie powiedzie się z ghc: out of memory. Podobnie, tłumacz mówi: ghci: out of memory.

Od id jest dość prosta funkcja, nie spodziewam się, że jest to obciążenie pamięci w czasie wykonywania lub czas kompilacji. Do czego służy cała pamięć?

+10

Chcesz skomponować te "identyfikatory". W VIM, kursorem na definicji 'f', wykonaj następujące czynności:': s/id id/id. id./g'. –

+1

Dałem ci swoją pierwszą złotą odznakę, poprzez upomnienie twojego pytania od +99 do +100 :). Znalazłem to, patrząc na wszystkie pytania z 99 głosami, i tych, którzy wysłali je bez złotej odznaki;). –

Odpowiedz

128

Wiemy typ id,

id :: a -> a 

A kiedy specjalizujemy to dla id id The lewo kopię id ma typ:

id :: (a -> a) -> (a -> a) 

a kiedy specjalizują się to ponownie dla najbardziej po lewej id w id id id, otrzymasz:

id :: ((a -> a) -> (a -> a)) -> ((a -> a) -> (a -> a)) 

Widzisz więc każdy dodany id, podpis typu z lewej strony id jest dwa razy większy.

Należy pamiętać, że typy są usuwane podczas kompilacji, więc zajmie to tylko pamięć w GHC. Nie zajmie pamięci w twoim programie.

+9

Zabawne, ale istotne: http://britton.disted.camosun.bc.ca/jbchessgrain.htm – Barmar

+0

Pamiętam, że Okasaki wpadł w podobne kłopoty, kiedy napisał kalkulator RPN osadzony w Haskell. – dfeuer

+3

Może chodzi o to, czy GHC powinien znaleźć sposób, by poradzić sobie z tego typu sprawami z większą wdziękiem. W szczególności typ jest bardzo duży, gdy jest zapisany w całości, ale istnieje olbrzymia ilość duplikacji - czy można wykorzystać tę opcję do kompresji takich rzeczy? Czy istnieje skuteczny sposób ich przetwarzania? – dfeuer

Powiązane problemy