Meine Absicht ist einfach. Ich möchte Funktionen vom Typ a -> b
in String -> String
umwandeln (so dass einige heterogene Funktionen in eine Liste eingefügt werden können). Also schreibe ich:
Allerdings ghc
Beschwerden:
Ich möchte wissen, warum mein Code nicht funktioniert und welche Art von Hacks benötigt werden, um mein Ziel zu erreichen?
Danke.
Ihr Code wird nicht funktionieren, weil Haskell keine Variablen vom Typ "repeat" oder "scope" verwendet; Die a
in wrap :: (Read a, Show b) => (a -> b) -> (String -> String)
ist eine völlig andere a
von der in read s :: a
(und sie sind beide allgemein quantifiziert). Dies ist die Quelle von a1
in der Fehlermeldung; GHC konvertiert das Programm alphabetisch nach
Allerdings ist der Argumenttyp von f
innerhalb von wrap
festgelegt. Das einfache Entfernen der Typannotation funktioniert problemlos. Ihre Funktion wird
Und Sie können es verwenden:
%Vor% Beachten Sie, dass read s
einen Typ hat, den Sie nicht aufschreiben können. In Haskell 2010 (oder 98) ist die einzige Möglichkeit, dies zu umgehen, die Verwendung einer Funktion wie asTypeOf :: a -> a -> a
; asTypeOf
ist nur const
, aber dank seiner Typsignatur beschränkt es sein erstes zurückgegebenes Argument auf den gleichen Typ wie seinen zweiten. Dann müssten Sie natürlich eine Variable vom Typ a
heraufbeschwören. Folgendes würde dafür funktionieren:
Um dies zu vermeiden, können Sie in GHC die Erweiterung ScopedTypeVariables
; Wenn Sie alle Typvariablen explizit mit forall
qualifizieren, werden sie genau wie Wertniveausamen definiert. Dann würde dein Code
Aber denken Sie daran, dass Sie für dieses einfache Beispiel keinerlei Typanmerkungen benötigen.
Um den Typ von read s
explizit anzugeben, benötigen Sie etwas wie ScopedTypeVariables
:
Da sich sonst die :: a
Annotation innerhalb der Funktion auf einen anderen Typ bezieht als a
in der Typ-Signatur (implizit bedeutet dies :: forall a. a
). Beachten Sie jedoch, dass Sie die Typ-Anmerkung auch einfach vollständig löschen können:
Da der Typ von read s
abgeleitet werden kann. Dadurch können Sie auch den Körper zu
Tags und Links haskell functional-programming