Помилка аналізу помилки 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визначити речі в ньому.

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

15
Дякую. "У реальному світі haskell" (принаймні, у моїй версії) немає letв своїх прикладах
Micah

43
"Learn you Haskell" це зовсім не згадує.
Бакуріу

2
@Bakuriu LYAH чи в даний час вже let. Але наступні заходи. В LYAHЯ прочитав addThree :: Int -> Int -> Int -> Int(переклад рядка) , addThree x y z = x + y + zале тільки другий працює в GHCiс let. Чому?
ізоморфізми

9
@Bakuriu Так, але автор каже вам написати свої визначення у зовнішній файл і завантажити його в GHCI, а не писати їх безпосередньо в GHCI. І колишній працює чудово.
superzamp

Тоді цей підручник явно неправильний: seas.upenn.edu/~cis194/lectures/01-intro.html . І все-таки це перший підручник, рекомендований на веб-сайті haskell!
cammil

51

Коли ви вводите вихідний файл Haskell,

f x = 2 * x

правильно.

Вводячи безпосередньо в ghci, вам потрібно ввести letна початку рядка:

let f x = 2 * x

12
Чому це не працює в GHCi? Чому є різниця в синтаксисі?
Бій

1
@Beat GHCi намагається оцінити вирази за замовчуванням, а не аналізувати оператори, тоді як формат файлу - навпаки. Ось чому, щоб робити заяви (тобто: встановлювати змінні, визначати функції тощо), ви повинні оголосити, що ви використовуєте let. Подумайте про GHCi як про одне велике let ... in ...твердження.
AJFarmar

20

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

Ця відповідь ілюструє цей приклад прикладом, і може дати більш детальне розуміння природи IO та ghci.


26
Ця відповідь марно для початківця. Він шукає простий підказок для просування вперед, а не просунуті теми. Ви не пояснюєте поліноміальних продуктів дитині, що вивчає таблицю множення - вона не показує, скільки ви знаєте, вона показує, що ви не знаєте, як ділитися тим, що ви знаєте.
btk

3
@btk: кожен повинен перестати бути початківцем у якийсь момент. Я вчора почав вивчати Haskell і впевнений, що через короткий час я зрозумію все, що говорить Raeez.
В'єнхі-Фуван

10
Це мій перший день навчання Haskell, і я знайшов цю відповідь дуже корисною для розуміння того, чому мені потрібно користуватися let; Я був на кшталт "wtf, навіщо мені користуватися let", а потім прочитав це і просвітився.
Брайан Тінгл

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.