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.
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 –