Lỗi phân tích cú pháp lỗi Haskell trên đầu vào `= '


111

Tôi mới sử dụng Haskell và sau khi bắt đầu, ghcitôi đã thử:

f x = 2 * x

và tôi đã nhận được:

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

mà tôi không hiểu.

Thật kỳ lạ, nó đã hoạt động tốt trước đây. Tôi cho rằng tôi đã định cấu hình sai Haskell. Cài đặt lại ghc6 không giải quyết được vấn đề.

Để biết thông tin, tôi sử dụng Ubuntu 10.4 và phiên bản ghc6 là 6.12.1-12

Câu trả lời:


160

Trong GHCi 7.x trở xuống, bạn cần phải letxác định những thứ trong đó.

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

Bắt đầu từ GHC 8.0.1, các ràng buộc cấp cao nhất được hỗ trợ trong GHCi , vì vậy mã của OP sẽ hoạt động mà không thay đổi.

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

15
Cảm ơn. "Real World Haskell" (ít nhất là phiên bản tôi có) không có lettrong các ví dụ của nó
Micah

43
"Learn you Haskell" hoàn toàn không đề cập đến vấn đề này.
Bakuriu

2
@Bakuriu bây giờ LYAH không đề cập đến let. Nhưng một cuộc tiếp theo. Trong LYAHtôi đọc addThree :: Int -> Int -> Int -> Int(dòng mới) addThree x y z = x + y + znhưng chỉ có cái thứ hai chạy GHCivới let. Tại sao?
isomorphismes

9
@Bakuriu Có nhưng tác giả yêu cầu bạn viết các định nghĩa của bạn trong một tệp bên ngoài và tải nó trong GHCI, không viết chúng trực tiếp trong GHCI. Và trước đây hoạt động hoàn hảo.
superzamp

Hướng dẫn này sau đó hoàn toàn sai: sea.upenn.edu/~cis194/lectures/01-intro.html . Tuy nhiên, đây là hướng dẫn đầu tiên được đề xuất trên trang web haskell!
cammil

51

Khi bạn nhập vào tệp nguồn Haskell,

f x = 2 * x

đúng.

Khi bạn nhập trực tiếp vào ghci, bạn cần nhập letở đầu dòng:

let f x = 2 * x

12
Tại sao nó không hoạt động trong GHCi? Tại sao có sự khác biệt trong cú pháp?
Đánh bại

1
@Beat GHCi cố gắng đánh giá các biểu thức theo mặc định, không phải các câu lệnh phân tích cú pháp, trong khi định dạng tệp thì ngược lại. Đó là lý do tại sao, để tạo các câu lệnh (ví dụ: đặt biến, xác định hàm, v.v.), bạn phải khai báo rằng bạn đang sử dụng let. Hãy coi GHCi như một let ... in ...tuyên bố lớn .
AJFarmar

20

Một nguyên tắc nhỏ để sử dụng ghci là bất kỳ mã nào bạn nhập vào phải tuân theo ngữ nghĩa do-block; nghĩa là, bạn có thể giả định về mặt cú pháp rằng bạn đang lập trình trong đơn nguyên IO (nếu đây là thuật ngữ mới, đừng lo lắng! Tôi thực sự khuyên bạn nên đọc qua hướng dẫn này ).

Đây câu trả lời minh họa điểm này với một ví dụ, và có thể cung cấp thêm cái nhìn sâu sắc làm việc vào bản chất của IO và ghci.


26
Câu trả lời này là vô ích cho người mới bắt đầu. Anh ấy đang tìm kiếm một gợi ý đơn giản có thể hành động để tiếp tục, không phải các chủ đề nâng cao. Bạn không giải thích các tích đa thức cho một đứa trẻ đang học bảng cửu chương - nó không hiển thị bạn biết bao nhiêu, nó cho thấy bạn không biết cách chia sẻ những gì bạn biết.
btk

3
@btk: một lúc nào đó mọi người phải dừng lại là người mới bắt đầu. Tôi đã bắt đầu học Haskell ngày hôm qua và tôi tự tin rằng trong một thời gian ngắn, tôi sẽ hiểu mọi điều Raeez nói.
Vietnhi Phuvan

10
Đây là ngày đầu tiên tôi học Haskell, và tôi thấy câu trả lời này rất hữu ích để hiểu tại sao tôi phải sử dụng let; Tôi đã giống như "wtf, tại sao tôi phải sử dụng let" và sau đó tôi đọc điều này và được khai sáng.
Brian Tingle

4

Bắt đầu từ GHC 8.0.1, điều này sẽ không còn tạo ra lỗi nữa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.