Ошибка синтаксического анализа ошибок Haskell при вводе `= '

111

Я новичок в Haskell и после запуска ghciпопробовал:

f x = 2 * x

и я получил:

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

чего я не понимаю.

Как ни странно, раньше это работало хорошо. Я полагаю, что неправильно сконфигурировал Haskell. Переустановка ghc6 не решает проблемы.

Для информации я использую Ubuntu 10.4, а версия ghc6 - 6.12.1-12.

Сын
источник

Ответы:

160

В GHCi 7.x или более ранней letверсии вам понадобится a, чтобы определять в нем вещи.

Prelude> let f x = x * 2
Prelude> f 4
8

Начиная с GHC 8.0.1, привязки верхнего уровня поддерживаются в GHCi , поэтому код OP будет работать без изменений.

GHCi, version 8.0.1.20161213: http://www.haskell.org/ghc/  :? for help
Prelude> f x = x * 2
Prelude> f 4
8
kennytm
источник
15
Спасибо. "Real world haskell" (по крайней мере, в моей версии) не имеет символа letв своих примерах
Мика
43
«Learn you Haskell» вообще не упоминает об этом.
Bakuriu 01
2
@Bakuriu LYAH ли в настоящее время уже let. Но продолжение. В LYAHя прочитал addThree :: Int -> Int -> Int -> Int(новая строка), addThree x y z = x + y + zно только второй работает GHCiс let. Зачем?
isomorphismes
9
@Bakuriu Да, но автор говорит вам записывать свои определения во внешний файл и загружать его в GHCI, а не записывать их непосредственно в GHCI. И первое работает отлично.
superzamp
Тогда это руководство совершенно неверно: sea.upenn.edu/~cis194/lectures/01-intro.html . Тем не менее, это первое руководство, рекомендованное на сайте haskell!
cammil
51

Когда вы вводите исходный файл Haskell,

f x = 2 * x

правильно.

Когда вы вводите непосредственно в ghci, вам нужно вводить letв начале строки:

let f x = 2 * x
dave4420
источник
12
Почему не работает в GHCi? Почему есть разница в синтаксисе?
Превосходство
1
@Beat GHCi пытается оценивать выражения по умолчанию, а не синтаксический анализ операторов, тогда как формат файла противоположный. Вот почему, чтобы делать утверждения (то есть: устанавливать переменные, определять функции и т. Д.), Вы должны объявить, что вы используете let. Думайте о GHCi как о большом let ... in ...заявлении.
AJFarmar
20

Хорошее практическое правило использования ghci состоит в том, что любой вводимый вами код должен соответствовать семантике do-block; то есть синтаксически вы можете предположить, что вы программируете в монаде ввода-вывода (если это новая терминология, не волнуйтесь! Я настоятельно рекомендую прочитать это руководство ).

Этот ответ иллюстрирует этот момент на примере и может дать более подробное представление о природе IO и ghci.

Раиз
источник
26
Этот ответ бесполезен для новичка. Он ищет простой действенный совет, чтобы двигаться дальше, а не сложные темы. Вы не объясняете полиномиальные произведения ребенку, изучающему таблицу умножения - она ​​не показывает, сколько вы знаете, это показывает, что вы не знаете, как поделиться тем, что вы знаете.
btk
3
@btk: в какой-то момент каждый должен перестать быть новичком. Вчера я начал изучать Haskell и уверен, что через короткое время я пойму все, что говорит Раиз.
Vietnhi Phuvan
10
Это мой первый день изучения Haskell, и я нашел этот ответ очень полезным для понимания того, почему я должен его использовать let; Я подумал: «Черт возьми, почему я должен использовать let», а потом прочитал это и получил просветление.
Брайан Тингл
4

Начиная с GHC 8.0.1 это больше не будет генерировать ошибку.

glguy
источник