Haskell hatası `= 'girişinde ayrıştırma hatası


111

Haskell'de yeniyim ve başladıktan sonra ghcidenedim:

f x = 2 * x

ve elde ettim:

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

ki anlamıyorum.

Garip bir şekilde, daha önce iyi çalıştı. Sanırım yanlış yapılandırılmış Haskell yaptım. Ghc6'nın yeniden yüklenmesi sorunu çözmez.

Bilgi için Ubuntu 10.4 kullanıyorum ve ghc6'nın sürümü 6.12.1-12

Yanıtlar:


160

GHCi 7.x veya altında, letiçindeki şeyleri tanımlamak için a'ya ihtiyacınız vardır .

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

GHC 8.0.1'den başlayarak, üst düzey bağlamalar GHCi'de desteklenmektedir , bu nedenle OP'nin kodu değişmeden çalışacaktır.

GHCi, version 8.0.1.20161213: http://www.haskell.org/ghc/  :? for help
Prelude> f x = x * 2
Prelude> f 4
8

15
Teşekkürler. "Gerçek dünya haskell" (en azından benim sahip olduğum sürüm) letörneklerinde bulunmaz
Micah

43
"Learn You Haskell" bundan hiç bahsetmiyor.
Bakuriu

2
@Bakuriu LYAH yok artık söz let. Ama bir takip. İçinde (yeni satır) LYAHokudum ama sadece ikincisi ile birlikte çalışıyor . Neden? addThree :: Int -> Int -> Int -> IntaddThree x y z = x + y + zGHCilet
isomorphismes

9
@Bakuriu Evet, ancak yazar size tanımlarınızı harici bir dosyaya yazmanızı ve GHCI'ye yüklemenizi, doğrudan GHCI'ye yazmamanızı söylüyor. Ve eski mükemmel çalışıyor.
superzamp

O halde bu öğretici kesinlikle yanlıştır: seas.upenn.edu/~cis194/lectures/01-intro.html . Yine de haskell web sitesinde önerilen ilk öğreticidir!
cammil

51

Bir Haskell kaynak dosyasına yazdığınızda,

f x = 2 * x

doğru.

Doğrudan ghci'ye yazdığınızda, satırın başına yazmanız gerekir let:

let f x = 2 * x

12
GHCi'de neden çalışmıyor? Sözdiziminde neden bir fark var?
yendi

1
@Beat GHCi varsayılan olarak ifadeleri değerlendirmeye çalışır, ifadeleri ayrıştırmaz, oysa dosya biçimi tam tersidir. Bu nedenle, ifadeler oluşturmak için (yani: değişkenleri ayarlamak, işlevleri tanımlamak, vb.) Kullandığınızı beyan etmeniz gerekir let. GHCi'yi büyük bir let ... in ...ifade olarak düşünün .
AJFarmar

20

Ghci'yi kullanmanın iyi bir kuralı, girdiğiniz herhangi bir kodun do-block semantiğine uyması gerektiğidir; yani, sözdizimsel olarak IO monad içinde programlama yaptığınızı varsayabilirsiniz (eğer bu yeni bir terminoloji ise endişelenmeyin! Bu öğreticiyi okumanızı şiddetle tavsiye ederim ).

Bu cevap, bu noktayı bir örnekle açıklar ve IO ve ghci'nin doğası hakkında daha fazla çalışma anlayışı sağlayabilir.


26
Bu cevap yeni başlayanlar için işe yaramaz. İleri düzey konuları değil, ilerlemek için uygulanabilir basit bir ipucu arıyor. Çarpım tablosunu öğrenen bir çocuğa polinom çarpımlarını açıklamazsınız - ne kadar bildiğinizi göstermez, bildiklerinizi nasıl paylaşacağınızı bilmediğinizi gösterir.
btk

3
@btk: Herkes bir noktada yeni başlayan olmayı bırakmalı. Dün Haskell'i öğrenmeye başladım ve kısa bir süre içinde Raeez'in söylediği her şeyi anlayacağımdan eminim.
Vietnhi Phuvan

10
Bu, Haskell'i öğrendiğim ilk günüm ve bu cevabı neden kullanmam gerektiğini anlamak için çok yararlı buldum let; "Wtf, neden kullanmam gerekiyor let" gibiydim ve sonra bunu okudum ve aydınlandım.
Brian Tingle

4

GHC 8.0.1'den itibaren bu artık bir hata oluşturmayacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.