Haskell hat eine Identitätsfunktion, die die Eingabe unverändert zurückgibt. Die Definition ist einfach:
id :: a -> a
id x = x
Zum Spaß sollte dies also Folgendes ausgeben 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
Nach einigen Sekunden (und laut Task-Manager ca. 2 GB Speicher) schlägt die Kompilierung mit fehl ghc: out of memory
. Ebenso sagt der Dolmetscher ghci: out of memory
.
Da id
es sich um eine ziemlich einfache Funktion handelt, würde ich nicht erwarten, dass sie zur Laufzeit oder zur Kompilierungszeit eine Speicherbelastung darstellt. Wofür wird der gesamte Speicher verwendet?
id
s komponieren . Führen Sie in VIM mit dem Cursor auf die Definition vonf
Folgendes aus ::s/id id/id . id ./g
.Antworten:
Wir kennen die Art von
id
,Und wenn wir uns darauf spezialisieren
id id
, hat die linke Kopie vonid
:Und dann , wenn Sie diese spezialisieren wieder für die ganz links
id
inid id id
, erhalten Sie:Sie sehen also, dass bei jedem
id
Hinzufügen die Typensignatur ganz linksid
doppelt so groß ist.Beachten Sie, dass Typen während der Kompilierung gelöscht werden, sodass nur Speicher in GHC belegt wird. Es nimmt keinen Speicherplatz in Ihrem Programm ein.
quelle
id
wiederholten Wiederholungenn
der Raum seines Typs proportional zu ist2^n
. Der in Ryans Code abgeleitete Typ würde2^27
zusätzlich zu der anderen Struktur, die zur Darstellung des Typs erforderlich ist, Verweise auf seine Typvariable benötigen, die wahrscheinlich viel größer ist, als Sie es von den meisten Typen erwarten würden.