2013-02-22 9 views
14

Gibt es eine Möglichkeit in ghci (oder ghc) zu finden, was der abgeleitete Typ einer lokalen Funktion ist?Suchen Sie den abgeleiteten Typ für die lokale Funktion

z. wenn ich eine Funktion haben

f l = map f' l 
    where f' = (+1) 

gibt es eine :t -ähnlichen Art und Weise in GHCI, um zu sehen, was der abgeleiteten Typ für f' ist?

Antwort

5

Ich kenne keine Möglichkeit, es von GHCi zu tun. Wenn Sie einen Editor wie Emacs oder Vim verwenden, können Sie versuchen, ghc-mod. Dies ist ein externes Tool, das an einen Editor angeschlossen wird und Ihnen einige IDE-ähnliche Funktionen für Haskell-Programme bietet, einschließlich der Möglichkeit, den Typ eines beliebigen Ausdrucks einschließlich einer lokalen Definition zu erhalten.

In Emacs würden Sie C-c C-t verwenden, um den Typ eines Ausdrucks zu finden.

Wenn Sie nicht Emacs oder Vim verwenden, könnten Sie wahrscheinlich ghc-mod als GHCi-Erweiterung oder etwas verpacken, aber ich denke, das wäre etwas peinlich. Ich kann mir keinen guten Weg vorstellen, dies ohne eine Editor-ähnliche Benutzeroberfläche zu tun. Ghc-mod selbst ist jedoch nur ein eigenständiges Befehlszeilentool, mit dem man einfach arbeiten kann. Wenn Sie sich eine gute Benutzeroberfläche vorstellen können, die unabhängig von einem vorhandenen Texteditor ist, sollten Sie es tun!

Natürlich, wenn Sie nicht Emacs oder Vim verwenden, sollten Sie wahrscheinlich: P.

+0

Ich habe Probleme, es funktioniert, aber das sieht toll aus! – amindfv

8

In der Tat gibt es, was ich über dank hammar super Antworten gelernt here. Hier ist die kurze Version:

Prelude> :l /tmp/foo.hs 
[1 of 1] Compiling Main    (/tmp/foo.hs, interpreted) 
Ok, modules loaded: Main. 
*Main> :break f 
Breakpoint 0 activated at /tmp/foo.hs:(1,1)-(2,18) 
*Main> f [1..10] 
Stopped at /tmp/foo.hs:(1,1)-(2,18) 
_result :: [b] = _ 
[/tmp/foo.hs:(1,1)-(2,18)] *Main> :step 
Stopped at /tmp/foo.hs:1:7-14 
_result :: [b] = _ 
f' :: b -> b = _ 
l :: [b] = _ 
[/tmp/foo.hs:1:7-14] *Main> :t f' 
f' :: b -> b 
+1

Dies zeigt nur die Art von "f" in Form von Variablen, die die Frage des OP nicht vollständig beantwortet. Sie können einen Schritt weiter gehen mit ': print f'', was die Auswertung von' f'' erzwingt. Dann wird ': t f''den konkreten Typ anzeigen. –

+0

Das ist faszinierend, ich kann nicht den vollen Typ bekommen, sogar mit @ Code-Guru's Note. Z.B. in diesem Fall sollte es "f" sein :: (Num b) => b -> b' – amindfv

+0

Ja, ich würde mich für eine Erklärung der Bedeutung interessieren, hier w/r/t Verhalten mit und ohne eine explizite polymorphe Typ-Signatur, sowie in Anwesenheit von Erweiterungen wie 'NoMonomorphismRestriction' und möglicherweise' MonoLocalBinds'. @amindfv Welche Version von GHC verwendest du? – jberryman

0

hdevtools Versuchen Sie, es ist sehr schnell und einfach zu bedienen, obwohl es gibt nur Integration für Vim.

+0

Können Sie beschreiben, wie Sie den Typ eines Ausdrucks mit hdevtools erhalten? – amindfv

+0

hdevtools Typ file.hs Zeilenspalte – lethalman

Verwandte Themen