Как использовать несколько предложений where в GHCi? - PullRequest
19 голосов
/ 18 июня 2010

Я впервые играю с 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| :}

выдает следующую ошибку:

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

Может ли кто-нибудь указать мне, что мне не хватает?

Ответы [ 2 ]

30 голосов
/ 18 июня 2010

Из справочного руководства ghci (http://www.haskell.org/ghc/docs/6.10.4/html/users_guide/interactive-evaluation.html):

Такие многострочные команды можно использовать с любой командой GHCi, а строки между :{ и :} просто объединяются в одну строку для интерпретации . Это означает, что каждая такая группа при объединении должна формировать одну действительную команду и что не используется правило размещения .

Поэтому вы должны вставлять точку с запятой между каждым определением, например

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

Редактировать: Похоже, вам нужна пара скоб в последней версии 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
6 голосов
/ 24 июня 2015

Золотое правило отступа : * код 1003 *, являющийся частью какого-либо выражения, должен иметь отступ больше начала этого выражения (даже если выражение не является самым левым элементом линия).

Prelude> :set +m

Неправильно:

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

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

Право:

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

Нет необходимости в скобках или точках с запятой.

...