2011-09-27 43 views
7

Tôi đang sử dụng Notepad ++ và WinGHCi để thực hiện một số bài tập về nhà và tôi phải xác định một "cơ sở dữ liệu" nhỏ. Định dạng là tùy ý và tôi không nghĩ đó là nơi tôi sẽ sai. Dù sao, đây là những gì tôi đang sử dụng trong một file .hs *:Sử dụng tập tin .hs

let studentDB = [ 
       ("sally", ["cpsc110", "cpsc312", "cpsc204"]), 
       ("jim",  ["cpsc110", "cpsc313"]), 
       ("bob",  ["cpsc121", "cpsc303", "cpsc212"]), 
       ("frank", ["cpsc110", "cpsc212", "cpsc204"]), 
       ("billy", ["cpsc312", "cpsc236"]), 
       ("jane", ["cpsc121"]), 
       ("larry", ["cpsc411", "cpsc236"]) ] 

WinGHCi mang lại cho tôi lỗi này: a1.hs: 118: 1: phân tích lỗi (có thể không chính xác thụt đầu dòng)

tôi đã cố gắng rối tung tabbing các bộ dữ liệu trên hoặc và đặt dấu ngoặc đơn danh sách của tôi trên các dòng khác nhau nhưng không thể nhận được bất cứ điều gì để làm việc. Tôi nghĩ rằng một cái gì đó nhỏ hơn sẽ giúp tôi theo dõi lỗi vì vậy tôi đã làm điều này để thay thế:

let s = [] 

Nhưng điều đó đã cho tôi cùng một lỗi. Đây có phải là một lỗi thụt lề, có thể do một số hành vi Notepad ++ kỳ quặc? Hay là Haskell của tôi sai? Cảm ơn.

Trả lời

14

Tôi tưởng tượng bạn đang nghĩ rằng nội dung của tệp * .hs giống như những gì bạn có thể nhập vào ghci. Điều đó không chính xác. Khi bạn nhập vào ghci, bạn đang nhập một cách hiệu quả vào khối do. Vì vậy, cú pháp sau đây là chính xác:

main = do 
    let s = [] 
    -- do more stuff 

Tuy nhiên, ở cấp cao nhất của tệp * .hs, mọi thứ khác nhau. Các let cấu trúc thực sự là

let s = [] in 
    codeThatReferencesS 

Nếu bạn muốn xác định một top-level ràng buộc, chỉ cần nói

s = [] 
+1

Chính xác những gì tôi đang tìm kiếm, cảm ơn bạn! – user966249

Các vấn đề liên quan