2012-11-30 25 views
7
showInt :: Int -> String 
showInt x = show x 

Yukarıdaki kod Int sözlüğü geçen show aramaları veya Show Int örneğinde bildirilen işlev çağrılarını doğrudan mu mu? YaniGHC mümkün olduğunda polimorfik indirmeyi kaldırır mı?

, GHC mümkün oluşturulan kodundan polimorfik indirection kaldırır mı?

+2

Genellikle Hammar tarafından gösterildiği sürece, ve bazen olmaz. Bu nedenle, daha genel soru şudur: "GHC'nin, dikte edilen dolaylı indirgemeyi optimize etmesini engelleyen durumlar nelerdir?" . Uzantıları içeren bazı durumlar biliyorum, ancak IIRC de, Haskell 98'de, belki de polimorfik özyinelemeli fonksiyonlarla böyle durumlar da var. > Vektör - -> Vektör –

cevap

10

Evet.

Gördüğünüz gibi
Foo.showInt :: GHC.Types.Int -> GHC.Base.String 
[... attributes omitted ...] 
Foo.showInt = GHC.Show.$fShowInt_$cshow 

, bu GHC.Show.$fShowInt_$cshow sadece doğrudan referans var: Bu GHC 7.4.2 kullanılarak üretilen çekirdeğidir. türetilmiş tip Show a => a -> String yerine kullanılacak şekilde

biz tip imzayı kaldırmak ne olur ile karşılaştırın:

İşte
Foo.showInt 
    :: forall a_aop. GHC.Show.Show a_aop => a_aop -> GHC.Base.String 
[... attributes omitted ...] 
Foo.showInt = 
    \ (@ a_aot) ($dShow_aou :: GHC.Show.Show a_aot) (x_a9Z :: a_aot) -> 
    GHC.Show.show @ a_aot $dShow_aou x_a9Z 

, bir sözlük argüman $dShow_aou alır ve bakmak için erişimci işlevi GHC.Show.show kullanır x_a9Z argümanına sonuç fonksiyonunu uygulamadan önce bu sözlükten uygun fonksiyon. birinci durumda ne olur

, en azından kavramsal olarak, beton tipi bilindiği için, GHC bir argüman olarak alarak yerine uygun örnek sözlüğüne doğrudan atıfta ekler olmasıdır. Daha sonra, temel olarak sadece bir kayıt etiketi olan erişimci belirtilebilir ve uygun işleve doğrudan referansla 'dan ayrılırsınız.

-7

GHC bunu yapmaz. okunabilirliği için yeni oluşturulan tip düşünün: GHC gibi bir işlevinden Polymorphicism kaldırır istiyorsanız

type Vector = (Float, Float) 

:

(!+!) :: Vector -> Vector -> Vector 
(x1, y1) !+! (x2, y2) = (x1 + x2, y1 + y2) 

tip olacak:

(!+!) :: (Float, Float) -> (Float, Float) -> (Float, Float) 

fonksiyon ment iken Vector için özellikle.

+5

bildirimi 'tip Vektör = (Float, Float)' tipi 'Vector' ve tip' (Float, Float) 'tam olarak aynıdır, ve fonksiyon tipi' Vektör vardır hem demektir 've (Float, Float) -> (Float, Float) -> (Float, Float)' türlerini kullanırlar, çünkü bunlar aynıdır, yani hayır, bu doğru değildir. – AndrewC

+3

Kod üretirken GHC, mümkün olan yerlerde polimorfik fonksiyonlar konusunda uzmanlaşır, bilinen tiplerde daha verimli versiyonlar üretir. Inlineing ayrıca indirmeyi çözmek için de kullanılabilir. –

İlgili konular