2013-08-02 8 views
9

folgenden gegeben,Haskell: Warum ist ein Ausdruck mit mehreren Zeilen ein Syntaxfehler?

module Foo where 

main = do 
    let foo = case 0 of 
    0 -> 4 
    return() 

GHC besteht darauf, dass ich einen Syntaxfehler haben:

Make.hs:5:5: parse error (possibly incorrect indentation) 

Warum? Ich habe Haskell eine Weile benutzt, und es sieht für mich korrekt aus.

+0

Haben Sie die Regeln für den Einzug überprüft? Es ist klar erklärt, dass – jozefg

Antwort

16

mehrzeilige Ausdrücke in do Syntax muss über die Variablennamen eingerückt werden:

main = do 
    let foo = case 0 of 
     0 -> 4 
    return() 

ist ok, aber

main = do 
    let foo = case 0 of 
     0 -> 4 
    return() 

nicht.

+2

hinzufügen, der Grund ist, dass "Let" einen Block (wie 'do') mit mehreren Bindungen-wenn Sie einen nicht ausgerichteten Stil der Einrückung bevorzugen, können Sie die Zeile nach" Let "wie Sie brechen würde mit 'tun'. –

+1

Dieser beißt mich ständig. Sie würden Einrückung nach dem "Let" erwarten, aber es ist tatsächlich Einrückung nach dem Variablennamen. Die Variable auf einer eigenen Linie zu platzieren funktioniert, sieht aber ziemlich hässlich aus. – MathematicalOrchid

+2

Das ist wirklich schwer zu sehen. Der Unterschied zwischen den beiden Beispielen ist ein Leerzeichen am Anfang der Zeile '0 -> 4'. – greg7gkb

Verwandte Themen