2013-07-26 30 views
6

I'am cố gắng để biên dịch mã Haskell rất nhỏ với GHC:Tại sao tôi không thể biên dịch với GHC nếu mã chứa định nghĩa mô-đun?

module Comma where 

import System.IO 

main = do 
    contents <- getContents 
    putStr (comma contents) 

comma input = 
    let allLines = lines input 
     addcomma [x] = x 
     addcomma (x:xs) = x ++ "," ++ (addcomma xs) 
     result = addcomma allLines 
    in result 

Lệnh Tôi đang sử dụng để biên dịch là:

GHC --make Comma.hs

Và tôi nhận được câu trả lời này:

[1 of 1] Biên dịch Comma (Comma.hs, Comma.o)

Không có tệp nào được tạo và không có cảnh báo hoặc thông báo lỗi.

Nếu tôi bình luận là "mô-đun Comma nơi" dòng từ mã nó biên dịch một cách chính xác:

[1 trong tổng số 1] Biên soạn chính (Comma.hs, Comma.o) Linking Comma ...

Tôi không hiểu điều gì đang xảy ra. Tôi đang sử dụng ghc 7,4,1 (Trình biên dịch Glasgow Haskell, Phiên bản 7.4.1, giai đoạn 2 được khởi động bởi phiên bản GHC 7.4.1) và ubuntu linux.

Tôi đánh giá cao nếu có ai có thể nói lý do tại sao không biên dịch với các định nghĩa module

+2

Sử dụng cờ '-main-is',' ghc -main-là Comma Comma' (bạn không cần '--make' với ghc kể từ 7.0). –

+2

Như một sang một bên, chương trình của bạn tương đương với điều này: 'main = interact $ intercalate", ". dòng' – chirlu

Trả lời

1

Nếu bạn có một định nghĩa main trong tập tin của bạn và bạn muốn biên dịch nó vào một thực thi bạn cần chỉ có thể có module Main where.

9

GHC biên dịch hàm Main.main làm điểm nhập của tệp thực thi. Khi bạn bỏ qua khai báo mô-đun, Module Main where được chèn hoàn toàn cho bạn.

Nhưng khi bạn đặt tên cho nó là gì đó khác hơn Main ghc không tìm thấy điểm vào.

Quy trình làm việc thông thường của tôi là sử dụng ghci (hoặc ghci + emacs) thay vì các đoạn mã này, cho phép bạn hoàn toàn bỏ qua vấn đề này. Ngoài ra, bạn có thể biên dịch với -main-is Comma để cho biết rõ ràng ghc sử dụng mô-đun Comma.

5

Không có tập tin được tạo ra

Bạn có chắc chắn? Tôi hy vọng rằng ít nhất Comma.oComma.hi được tạo. Trước đây chứa mã đã biên dịch sẵn sàng để được liên kết thành một tệp thực thi và sau đó chứa thông tin giao diện mà ghc sử dụng để đánh máy các mô-đun nhập mô-đun Comma.

Tuy nhiên, ghc sẽ chỉ liên kết các mô đun được biên dịch thành tệp thực thi nếu có chức năng chính. Theo mặc định, điều đó có nghĩa là một hàm có tên main trong mô-đun có tên Main. Nếu bạn không đặt tên mô-đun rõ ràng, tên Main được giả định và đó là lý do tại sao thử nghiệm của bạn hoạt động khi bạn xóa dòng module Comma where.

Để biên dịch và liên kết file Comma.hs bạn có thể sử dụng module Main where thay vì module Comma where, hoặc bạn có thể sử dụng -main-is cờ để nói GHC rằng là trở thành chức năng chính:

ghc --make -main-is Comma Comma.hs 

Hoặc:

ghc --make -main-is Comma.main Comma.hs 
Các vấn đề liên quan