2008-12-04 12 views
7

Ich bin an meinem Haskell ein wenig eingerostet und freue mich darauf, wieder hochzufahren. Eine Sache, die ich von F # genieße, ist die in Visual Studio integrierte F # Interactive Shell: Ich kann praktisch alles (einschließlich Funktions- und Klassendefinitionen) auswerten und F # als Shell verwenden. Gibt es ein Äquivalent in Haskell? Wenn ich ghci verwende, kann ich Funktionsdefinitionen nicht auswerten. Wie arbeitest du da?Haskell Interactive

Meine aktuelle bevorzugte Einstellung verwendet Emacs mit Haskell-Modus und Öffnen eines interaktiven Ghi-Interpreters. Gibt es jedoch eine Möglichkeit, nur die Region einer Datei zu bewerten?

Antwort

8

Sie können eine Funktion ‚lassen‘ definieren:

$ ghci 
Prelude> let double n = n + n 
Prelude> double 42 
84 

Auch werde ich nicht ganz dieses empfehlen, da (A) Ich habe es geschrieben, und (B) es ist schrecklich unentwickelt, aber Halp kann praktisch in Emacs - es ist ein bisschen wie eine Tabellenkalkulation für Haskell-Code, die direkt in Ihren Quellcode-Puffer integriert ist. Sie können eine Reihe von Ausdrücken haben, an denen Sie interessiert sind, und mit einem Tastendruck sehen Sie, wie sich ihre Werte in Abhängigkeit von Ihren Änderungen seit der letzten Neubewertung ändern.

+1

Danke. Halp sieht tatsächlich praktisch aus. Ich werde es ausprobieren :) – namin

+1

Cool! Verbesserungen wären willkommen - die Python-Version ist mehr poliert, weil ich mehr Python verwende. –

1

ghci bietet einige spezielle Syntax für solche Dinge. Verwenden Sie let für Funktionsdefinitionen. Es ist jedoch auf der GHC FAQ vermerkt, dass es mit komplexen Funktionen schwierig sein kann und im Allgemeinen das Laden von einer Datei bevorzugt wird. Wenn Sie etwas wie Emacs verwenden, das eine einfache Integration zwischen Ihrer Quelldatei und einem ghci-Prozess ermöglicht, wird dies zu einem Nicht-Problem, da Sie Ihre Definitionen mit einem Tastendruck in den Interpreter laden können.

+0

Gibt es in Emacs eine Möglichkeit, einen Bereich einer Datei im Gegensatz zu der gesamten Datei zu laden? Keine – namin

+0

, hier sind die Haskell-Modus GHCI Befehle: haskell-GHCI-load-Datei haskell-GHCI-Modus haskell-GHCI-Reload-Datei haskell-GHCI-show-GHCI-Puffer haskell-GHCI-Start- Prozess Sie erhalten nur laden/neu laden Unterstützung. –

0

Mit O'Caml und F #, Definitionen gehen von der Spitze der Datei nach unten. In Haskell kann jedoch ein Typ oder eine Funktion, die zuvor in einer Datei definiert wurden, später auf einen Typ oder eine Funktion in dieser Datei verweisen. In Haskell muss also ein Modul auf einmal kompiliert werden. Eine interaktive Schleife ist nur mit der Kompilierung inkompatibel.

2

Haskell-Modus für Emacs bieten Funktionen für die Arbeit mit Interpreter. Wenn Sie also eine Funktion aus dem bearbeiteten Modul ausführen wollen, können Sie Cc Cl verwenden, um das aktuelle Modul zu ghci (oder einem anderen interaktiven hakkell) zu laden und mit interaktiv in den Puffer zu wechseln und dort einige Befehle auszuführen.

2

Beobachtet wurde, GHCi ist ziemlich eingeschränkt in dem, was es tun kann - kurze Funktionen oder Ausdrücke sind alles, was an der Befehlszeile einfach ist. Für den Rest finde ich mich Module zu laden. Eine der Schwierigkeiten ist, dass Haskell keine Definition vor der Verwendung hat, so dass es oft schwer ist, ein aussagekräftiges Fragment aus einer Datei zu ziehen. Im Allgemeinen finde ich kleine Module, lade und lade sie neu. Das interaktive Erlebnis ist definitiv nicht so schön, wie man es sich wünscht.

0

Flymake kombiniert mit Emacs Haskell Modus 2.8 funktioniert sehr gut und Sie erhalten eine sofortige Antwort des Typprüfers. In meinen Augen ist das interaktiver.