Błąd Haskell Błąd analizy składni na wejściu `= '

111

Jestem nowy w Haskell i po rozpoczęciu ghcipróbowałem:

f x = 2 * x

i uzyskałem:

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

których nie rozumiem.

O dziwo, wcześniej działało dobrze. Przypuszczam, że źle skonfigurowałem Haskella. Ponowna instalacja ghc6 nie rozwiązuje problemu.

Dla informacji używam Ubuntu 10.4, a wersja ghc6 to 6.12.1-12

Syn
źródło

Odpowiedzi:

160

W GHCi 7.x lub starszym musisz letzdefiniować rzeczy w nim.

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

Począwszy od GHC 8.0.1, powiązania najwyższego poziomu są obsługiwane w GHCi , więc kod OP będzie działał bez zmian.

GHCi, version 8.0.1.20161213: http://www.haskell.org/ghc/  :? for help
Prelude> f x = x * 2
Prelude> f 4
8
kennytm
źródło
15
Dzięki. „Prawdziwy haskell świata” (przynajmniej wersja, którą mam) nie ma letw swoich przykładach
Micah.
43
„Learn you Haskell” w ogóle o tym nie wspomina.
Bakuriu
2
@Bakuriu LYAH ma teraz wspomnieć let. Ale kontynuacja. W LYAHczytam addThree :: Int -> Int -> Int -> Int(nowa linia), addThree x y z = x + y + zale tylko druga wbiega GHCiz let. Czemu?
izomorfizmy
9
@Bakuriu Tak, ale autor mówi ci, abyś zapisywał swoje definicje w zewnętrznym pliku i ładował go w GHCI, a nie zapisywał ich bezpośrednio w GHCI. A ta pierwsza działa doskonale.
superzamp
Ten samouczek jest więc po prostu błędny: seas.upenn.edu/~cis194/lectures/01-intro.html . Jednak jest to pierwszy samouczek polecany na stronie internetowej haskell!
cammil
51

Kiedy piszesz do pliku źródłowego Haskell,

f x = 2 * x

jest poprawne.

Kiedy piszesz bezpośrednio w ghci, musisz wpisać letna początku linii:

let f x = 2 * x
dave4420
źródło
12
Dlaczego nie działa w GHCi? Dlaczego istnieje różnica w składni?
Pokonaj
1
@Beat GHCi domyślnie próbuje oceniać wyrażenia, a nie analizować instrukcje, podczas gdy format pliku jest odwrotny. Dlatego, aby tworzyć instrukcje (tj. Ustawiać zmienne, definiować funkcje itp.), Musisz zadeklarować, że używasz let. Pomyśl o GHCi jako o jednym wielkim let ... in ...stwierdzeniu.
AJFarmar
20

Dobrą praktyczną zasadą korzystania z ghci jest to, że każdy wprowadzany kod powinien być zgodny z semantyką do-block; to znaczy, możesz składnie założyć , że programujesz w monadzie IO (jeśli jest to nowa terminologia, nie martw się! Gorąco polecam przeczytanie tego samouczka ).

Ta odpowiedź ilustruje ten punkt na przykładzie i może zapewnić bardziej praktyczny wgląd w naturę IO i ghci.

Raeez
źródło
26
Ta odpowiedź jest bezużyteczna dla początkującego. Szuka prostej, praktycznej wskazówki, aby przejść do przodu, a nie zaawansowanych tematów. Nie wyjaśniasz iloczynów wielomianowych dziecku uczącemu się tabliczki mnożenia - nie pokazuje, ile wiesz, pokazuje, że nie wiesz, jak podzielić się tym, co wiesz.
btk
3
@btk: każdy musi w pewnym momencie przestać być początkującym. Zacząłem się uczyć Haskella wczoraj i jestem pewien, że w krótkim czasie zrozumiem wszystko, co mówi Raeez.
Vietnhi Phuvan,
10
To jest mój pierwszy dzień nauki Haskella i uważam, że ta odpowiedź jest bardzo pomocna w zrozumieniu, dlaczego muszę używać let; Pomyślałem „wtf, dlaczego muszę używać let”, a potem przeczytałem to i zostałem oświecony.
Brian Tingle
4

Począwszy od wersji GHC 8.0.1 nie generowałoby to już błędu.

glguy
źródło