Как использовать несколько, где пункты в GHCI?

StackOverflow https://stackoverflow.com/questions/3067885

  •  28-09-2019
  •  | 
  •  

Вопрос

Я впервые играю с 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 `='

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

Это было полезно?

Решение

Из справочного руководства 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

Другие советы

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

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| 

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top