Ich habe eine Art sendefähiges wie folgt benannt:Gibt es eine Möglichkeit, die Funktion entpacken auf Showable in GHC Haskell darzustellen?
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE ExplicitForAll #-}
data Showable = forall a . Show a => Showable a
dann eine Funktion zu machen, die es packt trivial ist. Ich muss nur schreiben:
Es scheint jedoch unmöglich, die Umkehrfunktion zu erstellen, die die Daten von Showable entpacken würde. Wenn ich versuche, einfach umzukehren, was ich für pack geschrieben habe und schreibe:
unpack :: exists a . Show a => Showable -> a
unpack (Showable x) = x
dann bekomme ich einen Fehler von GHC.
Ich habe in den Dokumenten auf GHC Language Erweiterungen nachgesehen und es scheint keine Unterstützung für das Schlüsselwort exists. Ich habe gesehen, dass es in einigen anderen Haskell-Compilern möglich sein könnte, aber ich würde es auch gerne in GHC machen.
Lustigerweise kann ich immer noch Muster auf Showable Muster und extrahieren Sie die Daten aus dem Inneren auf diese Weise. Also könnte ich den Wert auf diese Weise herausholen, aber wenn ich eine Pointfree-Funktion mit Showable machen wollte, dann müsste ich entpacken.
Gibt es also eine Möglichkeit, das Entpacken in GHC's Haskell zu implementieren, vielleicht mit Type Families oder einer anderen arkanen Magie, die GHC-Erweiterungen sind?
Was würde '(auspacken (Pack (1 :: Int))) :: String 'sei? – Cirdec
Ich denke, das sollte ein Fehler bei der Kompilierung sein, da Sie versuchen, einen Typ anzugeben, nachdem Sie den Wert gepackt haben, weil Sie nach dem Packen Informationen über den Tippfehler verlieren, so dass Sie nicht wissen können, ob das möglich ist Ändern Sie den Typ in String. –