Ich versuche, eine einfache Funktion zu definieren, die mehrere Zeilen in ghci umfasst. Nehmen Sie als Beispiel Folgendes:
let abs n | n >= 0 = n
| otherwise = -n
Bisher habe ich versucht, nach der ersten Zeile die Eingabetaste zu drücken:
Prelude> let abs n | n >= 0 = n
Prelude> | otherwise = -n
<interactive>:1:0: parse error on input `|'
Ich habe auch versucht, die Befehle :{
und zu verwenden :}
, komme aber nicht weit:
Prelude> :{
unknown command ':{'
use :? for help.
Ich verwende GHC Interactive Version 6.6 für Haskell 98 unter Linux. Was fehlt mir?
:{
,:}
.Antworten:
Für Wachen (wie in Ihrem Beispiel) können Sie sie einfach alle in eine Zeile setzen und es funktioniert (Wachen kümmern sich nicht um Abstände)
Wenn Sie Ihre Funktion mit mehreren Definitionen schreiben möchten, deren Muster mit den Argumenten übereinstimmt, wie folgt:
Dann würden Sie geschweifte Klammern mit Semikolons verwenden, die die Definitionen trennen
quelle
GHCi verfügt jetzt über einen mehrzeiligen Eingabemodus, der aktiviert ist mit: set + m. Beispielsweise,
quelle
ghci
verhält es sich in dieser Hinsicht ähnlich wie der Python-Interpreter. Sehr angenehm! Sie können in der Tat eine.ghci
Datei in Ihrem Home-Verzeichnis erstellen, in die Sie den:set +m
Multiline-Modus einfügen, der bei jedem Start zum Standard wirdghci
!:set prompt "λ "
den fortgesetzten Zeilen setze,Prelude
statt sagenλ
. Wie kann man das umgehen?let
.let
Gebenlet
Sie einfach ein gefolgt von einem Zeilenumbruch ein: ⏎. Dannfac 0 = 1
⏎. Dannfac n = n * fac (n-1)
⏎ ⏎ und du bist fertig!Dan ist richtig, aber
:{
und:}
muss jeder in seiner eigenen Zeile erscheinen:Dies interagiert auch mit der Layoutregel. Wenn Sie also die Do-Notation verwenden, ist es möglicherweise einfacher, Klammern und Semikolons explizit zu verwenden. Diese Definition schlägt beispielsweise fehl:
Aber es funktioniert, wenn Klammern und Semikolons hinzugefügt werden:
Dies ist nur dann wirklich wichtig, wenn Definitionen aus einer Datei eingefügt werden, bei denen sich der Einzug ändern kann.
quelle
Es sieht aus wie
:{
und:}
ist eine ziemlich neue Funktion. Möglicherweise müssen Sie GHC aktualisieren.Bearbeiten: bestätigt, siehe http://www.haskell.org/ghc/docs/6.8.2/html/users_guide/release-6-8-2.html
quelle
Wenn Sie GHC nicht nur für
:{
und aktualisieren möchten,:}
müssen Sie alles in eine Zeile schreiben:Mir ist keine einzelne Definition in Haskell bekannt, die in mehreren Zeilen geschrieben werden muss . Das Obige funktioniert tatsächlich in GHCi:
Für andere Ausdrücke, wie z. B.
do
Blöcke, müssen Sie die Nicht-Layout-Syntax mit geschweiften Klammern und Semikolons (eugh) verwenden.quelle
Ich verwende GHCi, Version 8.2.1 unter macOS Catalina 10.15.2. Im Folgenden werden sowohl die Funktionstypdeklaration als auch die Schutzvorrichtungen zusammengestellt. Beachten Sie, dass die vertikalen Balken links für mehrere GHCi-Zeilen gelten.
quelle
:{
und vor Ihrer Typdeklaration:}
nichts angeben müssenlet
, müssen Sie keine zweite und nachfolgende Zeile einrücken.Es sieht so aus, als würden beide Zeilen gleichzeitig eingefügt oder die Strg-Eingabe für jede neue Zeile verwendet, um alles zusammenzuhalten, zumindest unter https://repl.it/languages/haskell . Am Anfang der zweiten Zeile sehen Sie 2 Punkte. Oder legen Sie es in eine Datei und: laden Sie die Datei (: l main). Wie kommt es, dass abs mit negativen Zahlen nicht funktioniert? Oh, du musst die Zahl in Klammern setzen.
quelle