Haskell error parse error pada input '='

111

Saya baru mengenal Haskell dan setelah memulai ghcisaya mencoba:

f x = 2 * x

dan saya memperoleh:

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

yang saya tidak mengerti.

Anehnya, ini berhasil dengan baik sebelumnya. Saya kira saya telah melakukan kesalahan konfigurasi pada Haskell. Menginstal ulang ghc6 tidak menyelesaikan masalah.

Sebagai informasi, saya menggunakan Ubuntu 10.4 dan versi ghc6 adalah 6.12.1-12

Putra
sumber

Jawaban:

160

Di GHCi 7.x atau di bawahnya, Anda perlu a letuntuk mendefinisikan hal-hal di dalamnya.

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

Mulai dari GHC 8.0.1, pengikatan tingkat atas didukung di GHCi , jadi kode OP akan berfungsi tanpa perubahan.

GHCi, version 8.0.1.20161213: http://www.haskell.org/ghc/  :? for help
Prelude> f x = x * 2
Prelude> f 4
8
kennytm
sumber
15
Terima kasih. "Real world haskell" (setidaknya versi yang saya miliki) tidak memiliki letcontohnya
Mikha
43
"Learn you Haskell" tidak menyebutkan ini sama sekali.
Bakuriu
2
@Bakuriu LYAH tidak sekarang menyebutkan let. Tapi tindak lanjut. Di LYAHsaya membaca addThree :: Int -> Int -> Int -> Int(baris baru) addThree x y z = x + y + ztetapi hanya yang kedua berjalan GHCidengan let. Mengapa?
isomorfisma
9
@Bakuriu Ya, tetapi penulis meminta Anda untuk menulis definisi Anda dalam file eksternal dan memuatnya di dalam GHCI, bukan untuk menulisnya secara langsung di GHCI. Dan yang pertama bekerja dengan sempurna.
superzamp
Tutorial ini kemudian salah: seas.upenn.edu/~cis194/lectures/01-intro.html . Namun ini adalah tutorial pertama yang direkomendasikan di situs web haskell!
cammil
51

Saat Anda mengetik di file sumber Haskell,

f x = 2 * x

benar.

Saat Anda mengetik langsung ke ghci, Anda perlu mengetik letdi awal baris:

let f x = 2 * x
dave4420
sumber
12
Mengapa tidak berhasil di GHCi? Mengapa ada perbedaan sintaks?
Kalahkan
1
@Beat GHCi mencoba mengevaluasi ekspresi secara default, bukan pernyataan parse, sedangkan format file sebaliknya. Itu sebabnya, untuk membuat pernyataan (yaitu: mengatur variabel, mendefinisikan fungsi, dll) Anda harus menyatakan bahwa Anda sedang menggunakan let. Pikirkan GHCi sebagai satu let ... in ...pernyataan besar .
AJFarmar
20

Aturan praktis yang baik untuk menggunakan ghci adalah bahwa kode apa pun yang Anda masukkan harus sesuai dengan semantik do-block; yaitu, Anda dapat berasumsi secara sintaksis bahwa Anda memprogram dalam monad IO (jika ini adalah terminologi baru, jangan khawatir! Saya sangat merekomendasikan membaca tutorial ini ).

Ini jawaban menggambarkan hal ini dengan sebuah contoh, dan dapat memberikan wawasan yang lebih bekerja ke dalam sifat IO dan ghci.

Raeez
sumber
26
Jawaban ini tidak berguna bagi pemula. Dia mencari petunjuk sederhana yang bisa ditindaklanjuti untuk bergerak maju, bukan topik lanjutan. Anda tidak menjelaskan produk polinomial kepada seorang anak yang mempelajari tabel perkalian - ini tidak menunjukkan seberapa banyak Anda tahu, ini menunjukkan Anda tidak tahu bagaimana membagikan apa yang Anda ketahui.
btk
3
@btk: setiap orang harus berhenti menjadi pemula di beberapa titik. Saya mulai mempelajari Haskell kemarin dan saya yakin bahwa dalam waktu singkat, saya akan memahami semua yang dikatakan Raeez.
Vietnhi Phuvan
10
Ini adalah hari pertama saya belajar Haskell, dan saya menemukan jawaban ini sangat membantu untuk memahami mengapa saya harus menggunakan let; Saya seperti "wtf, mengapa saya harus menggunakan let" dan kemudian saya membaca ini dan tercerahkan.
Brian Tingle
4

Mulai GHC 8.0.1 ini tidak lagi menghasilkan kesalahan.

glguy
sumber