2014-05-19 32 views
108

Haskell, girdiyi değiştirmeden veren bir kimlik fonksiyonuna sahiptir. tanım basittir: eğlence için YaniHaskell'in neden "hiçbir şey yapmama" fonksiyonu var id, tonlarca hafızayı tüketiyor?

id :: a -> a 
id x = x 

, bu çıkış 8 yapmalıdır: Birkaç saniye (ve Görev Yöneticisi göre belleğin yaklaşık 2 gb) sonra

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 

, derleme ghc: out of memory başarısız olur. Benzer şekilde, tercüman ghci: out of memory diyor.

id oldukça basit bir işlev olduğundan, çalışma zamanında bellek yükü veya derleme zamanı olmasını beklemezdim. Tüm bellek ne için kullanılıyor?

+10

Bu kimlikleri oluşturmak istersiniz. VIM'de, 'f' tanımı üzerine imleci ile şunu yapın:': s/id id/id. kimlik/g –

+1

Size ilk altın rozetinizi verdim, +99'dan +100'e kadar olan soruları yukarı-oylayarak :). Tüm sorulara 99 oyla ve bunları altın rozet olmadan gönderenlere bakarken buldum;). –

cevap

128

Biz

id :: a -> a 

, id tipini biliyorum Ve id id için bu uzmanlaşmak zaman yazın etti id ait kopyasını sol:

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

Ve sonra tekrar bu uzmanlaşmak zaman id id id içinde en soldaki id için aşağıdakilere sahip olursunuz:

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

Böylece, her id eklediğiniz görüyorsunuz, en soldaki id türünün imzası iki kat büyüktür.

Derleme sırasında türlerin silineceğini unutmayın, bu nedenle yalnızca GHC'de bellek kalkar. Programında hafızaya girmeyecek.

+9

Eğlenceli ama ilgili: http://britton.disted.camosun.bc.ca/jbchessgrain.htm – Barmar

+0

Okasaki'yi, Haskell'e gömülü bir RPN hesap makinesi yazarken benzer bir sıkıntıya girdiğini hatırlıyorum. – dfeuer

+3

Soru, belki de, GHC'nin bu tür bir şeyi daha incelikle ele almanın bir yolunu bulup bulmaması gerektiğidir. Özellikle, yazı tam olarak yazıldığında çok büyüktür, ancak muazzam miktarda çoğaltma vardır — paylaşma bu tür şeyleri sıkıştırmak için kullanılabilir mi? Onları işlemek için verimli bir yol var mı? – dfeuer

İlgili konular