2010-06-18 7 views
18

Ich spiele zum ersten Mal mit GHCi herum und habe Probleme beim Schreiben von Mehrzeilenfunktionen. Mein Code ist wie folgt:Wie verwende ich mehrere Where-Klauseln in GHCi?

Prelude> :{ 
Prelude| let diffSquares lst = abs $ squareOfSums lst - sumOfSquares lst 
Prelude| where 
Prelude|  squareOfSums lst = (fst (sumsAndSquares lst))^2 
Prelude|  sumOfSquares lst = snd (sumsAndSquares lst) 
Prelude|  sumsAndSquares = foldl (\(sms,sqrs) x -> (sms+x,sqrs+x^2)) (0,0) 
Prelude| :} 

Es gibt den folgenden Fehler:

<interactive>:1:142: parse error on input `=' 

Könnte jemand zeigen Sie mir freundlich in Richtung dessen, was ich bin fehlt?

Antwort

29

Vom Hilfe-Handbuch von GHCI (http://www.haskell.org/ghc/docs/6.10.4/html/users_guide/interactive-evaluation.html):

Such multiline commands can be used with any GHCi command, and the lines between :{ and :} are simply merged into a single line for interpretation. That implies that each such group must form a single valid command when merged, and that no layout rule is used.

Daher müssen Sie ein Semikolon zwischen jeder Definition einzufügen, z.B.

Prelude> :{ 
Prelude| let a x = g 
Prelude| where 
Prelude|  g = p x x;  {- # <----- # -} 
Prelude|  p a b = a + b 
Prelude| :} 

Edit: Es scheint, dass Sie ein Paar Klammern statt in der jüngsten Version von GHCi benötigen.

Prelude> :{ 
Prelude| let { a x = g 
Prelude| where 
Prelude|  g = p x x 
Prelude|  p a b = a + b 
Prelude| } 
Prelude| :} 
Prelude> a 5 
10 
+0

Großartig, vielen Dank. –

+1

geschickte, große Antwort. Nie zuvor gesehen oder benutzt. –

+0

Funktioniert nicht ab GHC 7.6.3 in Ubuntu-Paketen: Parse-Fehler bei Eingabe "wo" –

5

The golden rule of indentation: Code, der Teil eines Ausdrucks ist, sollte (auch wenn der Ausdruck nicht die am weitesten links liegende Element der Leitung) als Beginn dieses Ausdrucks eingekerbt weiter werden.

Prelude> :set +m 

Falsch:

Prelude> let foo = x 
Prelude|  where x = 1 
Prelude| 

<interactive>:3:1: 
    parse error in let binding: missing required 'in' 

Rechts:

Prelude> let foo = x 
Prelude|  where x = 1 
Prelude| 

Keine Notwendigkeit für Zahnspangen oder Semikolons.

Verwandte Themen