Как использовать несколько предложений where в GHCi?
Я играю с 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 `='
Может ли кто-то любезно указать мне на то, что мне не хватает?
Ответы
Ответ 1
В справочном руководстве по 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
Ответ 2
Золотое правило отступа: код, который является частью некоторого выражения, должен быть отступом дальше, чем начало этого выражения (даже если выражение не является самым левым элементом строки).
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|
Нет необходимости в фигурных скобках или точках с запятой.