Haskell memiliki fungsi identitas yang mengembalikan masukan tanpa perubahan. Definisinya sederhana:
id :: a -> a
id x = x
Jadi untuk bersenang-senang, ini harus menghasilkan 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
Setelah beberapa detik (dan sekitar 2 gb memori menurut Pengelola Tugas), kompilasi gagal dengan ghc: out of memory
. Demikian kata penerjemah ghci: out of memory
.
Karena id
ini adalah fungsi yang cukup sederhana, saya tidak akan mengharapkannya menjadi beban memori pada saat menjalankan atau waktu kompilasi. Untuk apa semua memori digunakan?
id
s itu. Dalam VIM, dengan kursor pada definisif
, lakukan ini::s/id id/id . id ./g
.Jawaban:
Kami tahu jenisnya
id
,Dan ketika kami mengkhususkan ini untuk
id id
, salinan kiriid
memiliki tipe:Dan kemudian ketika Anda mengkhususkan ini lagi untuk yang paling kiri
id
diid id id
, Anda mendapatkan:Jadi Anda melihat setiap yang
id
Anda tambahkan, tanda tangan tipe paling kiriid
dua kali lebih besar.Perhatikan bahwa tipe dihapus selama kompilasi, jadi ini hanya akan menggunakan memori di GHC. Ini tidak akan memakan memori di program Anda.
sumber
id
diulangn
kali, maka spasi jenisnya sebanding dengan2^n
. Tipe yang disimpulkan dalam kode Ryan akan membutuhkan2^27
referensi ke variabel tipe selain struktur lain yang diperlukan untuk merepresentasikan tipe, yang mungkin jauh lebih besar daripada yang Anda harapkan dari kebanyakan tipe.