Wie erhalte ich den Typ eines beliebigen Ausdrucks in einer Datei in Haskell?

8

:type ist nicht genug, da der Ausdruck, den ich haben möchte, lokal definierte Variablen enthalten kann, wie Dinge, die mit <- , let oder where zugewiesen wurden. Getippte Löcher (die den Ausdruck mit _ ersetzen und mit ghc laden) sind eng, aber sie geben dir, was dort akzeptiert wird, was allgemeiner sein kann als der Ausdruck, über den du neugierig bist.

Ich dachte, ich hätte den Jackpot mit :type-at gefunden, aber ich kann nicht so arbeiten, wie ich es mir erhofft habe. Mit dieser Datei namens "thing.hs":

%Vor%

Das ist das Ergebnis, wenn ich :type-at :

verwende %Vor%

Das ist im Grunde das Gleiche wie die Verwendung von :type . Ich hatte gehofft, dass ich es sogar schaffen könnte, den Bereich für return something zu übergeben und Monad a => a () oder IO () zu erhalten. Wäre noch cooler, wenn man wählen könnte zwischen dem Typ des Ausdrucks allein und dem Typ des Ausdrucks "an diesem Punkt" (nachdem er durch den Typ eingeschränkt wurde, der mit einem Typ-Loch erscheinen würde), aber beides wäre in Ordnung / p>     

JoL 07.02.2018, 22:14
quelle

2 Antworten

5

Wenn ich :type-at thing.hs 5 8 5 14 versuche, bekomme ich :: () -> IO () . :type-at thing.hs 5 14 5 24 funktioniert ebenso wie :type-at thing.hs 5 14 6 1 .

Die rechte Schranke sollte also die Zelle sein, die hinter dem Ende des Ausdrucks steht.

    
Davislor 07.02.2018, 22:27
quelle
3

Manchmal kann man einfach ein getipptes Loch vor dem des Ausdrucks verwenden, für den Sie sich interessieren, und das Loch so verwenden, als wäre es eine Funktion. Zum Beispiel

%Vor%

Auf diese Weise wird das Loch mit etwas wie WantedType -> OtherType typisiert, wobei WantedType der Typ f 3 ist.

Dies ist jedoch nicht ideal, da das Loch eine Fehlfunktion verhindert, um seine Aufgabe zu erfüllen. D. h., Manchmal ist der Typ von f 3 polymorph, und sein Kontext zwingt ihn, instanziiert zu werden. Zum Beispiel macht 4 + length [] 4 zu Int , auch wenn es einen beliebigen Num -Typ haben kann. Durch die Verwendung von (_ 4) + length [] wird eine Funktion zwischen dem beliebigen Num -Typ (der standardmäßig auf Integer gesetzt wird) und dem benötigten Int eingefügt, wodurch Fehleinschätzungen des Typs Fehlverhalten entstehen.

Stattdessen könnte eine Alternative die Verwendung der Übersetzung sein

%Vor%

Dies sollte besser mit der Typ-Inferenz abgespielt werden und den richtigen Typ zurückgeben.

Natürlich sollte es besser sein herauszufinden, wie :type-at funktioniert. Dennoch ist der Typ-Loch-Trick nicht zu unbequem, wenn Sie bereits einen Editor an der Stelle geöffnet haben.

    
chi 07.02.2018 22:28
quelle

Tags und Links