Ja. Dies ist der erzeugte Kern GHC mit 7.4.2:
Foo.showInt :: GHC.Types.Int -> GHC.Base.String
[... attributes omitted ...]
Foo.showInt = GHC.Show.$fShowInt_$cshow
Wie Sie sehen, es ist nur ein direkter Bezug auf GHC.Show.$fShowInt_$cshow
.
vergleichen mit dem, was passiert, wenn wir die Art Signatur entfernen, so dass der abgeleitete Typ Show a => a -> String
stattdessen verwendet wird:
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
Hier braucht es ein Wörterbuch Argument $dShow_aou
und verwendet die Zugriffsfunktion GHC.Show.show
nachschlagen die entsprechende Funktion aus diesem Wörterbuch vor dem Anwenden der resultierenden Funktion auf das Argument x_a9Z
. Im ersten Fall, zumindest konzeptionell, ist es so: Da der konkrete Typ bekannt ist, fügt GHC einen direkten Verweis auf das entsprechende Instanzwörterbuch ein, anstatt es als Argument zu verwenden. Dann kann der Accessor, der im Grunde nur ein Plattenlabel ist, inline sein, und Sie haben mit einem direkten Verweis auf die entsprechende Funktion.
Es wird oft tun, wie von hammar gezeigt, und manchmal nicht. Daher ist die allgemeinere Frage: "Welche Situationen verhindern, dass GHC die sprachliche Indirektion umgeht?" . Ich kenne einige Situationen mit Erweiterungen, aber IIRC gibt es auch solche Fälle in Haskell 98, vielleicht mit polymorphen rekursiven Funktionen. –