ข้อผิดพลาดในการแยกวิเคราะห์ข้อผิดพลาด 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ในตัวอย่าง
คาห์

43
"Learn you Haskell"ไม่ได้กล่าวถึงเรื่องนี้เลย
Bakuriu

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

กวดวิชานี้เป็นแล้วผิดธรรมดา: 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 monad (ถ้านี้เป็นคำศัพท์ใหม่ไม่ต้องกังวล! ฉันขอแนะนำการอ่านผ่านทางนี้กวดวิชา )

นี้คำตอบที่แสดงให้เห็นถึงจุดนี้ด้วยตัวอย่างและอาจให้ข้อมูลเชิงลึกในการทำงานมากยิ่งขึ้นในลักษณะของ IO และ ghci


26
คำตอบนี้ไม่มีประโยชน์สำหรับผู้เริ่มต้น เขากำลังมองหาคำแนะนำง่ายๆที่สามารถดำเนินการได้เพื่อก้าวไปข้างหน้าไม่ใช่หัวข้อขั้นสูง คุณไม่ได้อธิบายผลิตภัณฑ์พหุนามให้เด็กที่เรียนรู้เกี่ยวกับตารางการคูณ - มันไม่ได้แสดงว่าคุณรู้มากแค่ไหนมันแสดงว่าคุณไม่รู้วิธีแบ่งปันสิ่งที่คุณรู้
btk

3
@btk: ทุกคนต้องเลิกเป็นมือใหม่ในบางจุด ฉันเริ่มเรียนรู้ Haskell เมื่อวานนี้และฉันมั่นใจว่าภายในเวลาอันสั้นฉันจะเข้าใจทุกสิ่งที่ Raeez พูด
Vietnhi Phuvan

10
วันนี้เป็นวันแรกของฉันเรียนรู้ Haskell และผมพบว่าคำตอบนี้มีประโยชน์มากสำหรับการทำความเข้าใจว่าทำไมฉันต้องใช้let; ฉันเป็นเหมือน "wtf ทำไมฉันต้องใช้let" จากนั้นฉันก็อ่านสิ่งนี้และได้รับการรู้แจ้ง
Brian Tingle

4

การเริ่มต้นใน GHC 8.0.1 สิ่งนี้จะไม่สร้างข้อผิดพลาดอีกต่อไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.