Nach this page auf Existenziale in Haskell zu lesen, war ich gezwungen, die Grenzen dieses Verhalten zu testen, so schrieb ich die Schnipsel folgenden Code:einen Funktionsaufruf in einer existentiellen Typ Auflösen
{-# LANGUAGE ExistentialQuantification #-}
data Showable = forall a. Show a => MkShowable a
pack :: Show a => a -> Showable
pack = MkShowable
instance Show Showable where
show (MkShowable x) = show x
Der Showable
Typ ist sehr ähnlich dem ShowBox
Typ, der im oben genannten Link erstellt wurde. Dann habe ich dieses erfundene Beispiel erstellt, um meine Frage zu illustrieren.
showSomething :: Bool -> Showable
showSomething True = pack 1
showSomething False = pack "ABC"
main :: IO()
main = do
x <- getLine
let y = read x
print $ showSomething y
Dieser Code (der gut arbeitet) fordert den Benutzer zur Eingabe (die ‚True‘ oder ‚False‘ sein soll), und dann 1
ausdruckt, ob es wahr oder "ABC"
ist, wenn es falsch ist.
Aber ich verstehe nicht vollständig, wie das System dies tut. Mathematisch macht es vollkommen Sinn. Aber ich sehe nicht, wie der Computer es lösen kann. Für mich sieht es so aus, als ob das System zur Laufzeit eine Entscheidung darüber trifft, ob 's show
Instanz oder String
' s show
Funktion aufgerufen werden soll, aber das würde die Existenz von etwas wie C++ 's Vtables implizieren, was Haskell meiner Meinung nach nicht hat ein Konzept von.
Meine Frage ist: Wie löst es das? Das System kann nicht im Voraus wissen, ob ich true oder false eingeben werde, so dass es nicht wissen kann, welches show
zur Kompilierungszeit aufgerufen wird, aber es funktioniert eindeutig in beiden Fällen.
Yup, Typklassen werden in zusätzliche wörterbuchähnliche Argumente transformiert, die Methodenimplementierungen für konkrete Instanzen enthalten. Dieses Argument wird in jeder Funktion mit 'Showable => 'signatur übergeben. – arrowd
Hier ist ein erstaunliches Video, SPJ spricht darüber: http://www.youtube.com/watch?v=6COvD8oynmI – arrowd
GHC hat etwas _exactly like_ C++ vtables. (Obwohl wir sie im Allgemeinen als "Methodenwörterbücher" bezeichnen.) – MathematicalOrchid