2010-06-18 15 views
18

Po raz pierwszy bawię się z GHCi i mam problemy z pisaniem funkcji wieloliniowych. Mój kod wygląda następująco:Jak używać wielu klauzul where w 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| :} 

To daje następujący błąd:

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

Czy ktoś łaskawie mi punkt w kierunku tego, co mi brakuje?

Odpowiedz

29

z podręcznika pomocy dla 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.

Dlatego trzeba wstawić średnik między każdej definicji, na przykład

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

Edycja: Wydaje się, trzeba parę szelek zamiast w najnowszej wersji GHCi.

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

Świetnie, wielkie dzięki. –

+1

sprytny, świetna odpowiedź. Nigdy tego nie widziałem ani nie używałem. –

+0

Nie działa od wersji GHC 7.6.3 w pakietach Ubuntu: analiza błędu na wejściu "where" –

5

The golden rule of indentation: kod, który jest częścią jakiejś wypowiedzi powinny być wcięte dalej niż na początku tego wyrażenia (nawet jeśli wyrażenie nie jest skrajny lewy element linii).

Prelude> :set +m 

Źle:

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

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

prawej:

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

Nie potrzeba szelek lub średnikami.

Powiązane problemy