2016-07-06 3 views
3

Ich kann kaum unterscheiden zwischen "where" und "let .. int" Aussagen. Hier ist mein Code. Ich möchte 2 Möglichkeiten 5.Lassen .. in Anweisung nicht in IO arbeiten?

main = do 
    print x 
     where x = 5 
    let x = 5 in print x 

Zuerst arbeitet man drucken, aber ich erhalte eine „analysieren Fehler bei der Eingabe‚lassen‘“ Ist das eine Frage der Vertiefung, oder ist mein Code nur falsch?

Antwort

4

where beendet immer eine Aussage; nichts sollte nach where gehen. So könnte man es so schreiben:

main = do 
    let x = 5 in print x 
    print x 
     where x = 5 

Dies gilt, weil die where Klausel der Anweisung endet, wo sie gehören soll. Ihr Code war ungültig, weil der Parser nach where x = 5 nichts erwartet hat, aber Ihre let-Klausel entdeckt hat.

+1

Was ist eine Aussage? Wie auch immer, "nichts sollte nach wo gehen" ist ungenau. Zum Beispiel: do {case() von {() -> return() wobei {() =()}}; return()} 'ist perfekt gültiger Haskell (vollgespannt und aus Gründen der Übersichtlichkeit semikoloniert). –

3

Ihr Code ist falsch. Die where-Klausel muss am Ende der Definition auftreten, während let ein Ausdruck ist, der überall dort auftreten kann, wo ein Ausdruck gültig ist.