2015-04-09 26 views
13

tôi học được từ chapter 9 of Learn You A Haskell For Great Good rằngCó nên chỉ định chữ ký loại cho chính hay không? Tại sao tại sao không?

Theo quy ước, chúng ta thường không chỉ định một tuyên bố kiểu cho main.

Theo như tôi có thể nói, quy ước này phổ biến. Tuy nhiên, nếu tôi biên soạn, sử dụng -Wall cờ, một chương trình mà thiếu một chữ ký kiểu cho main, chẳng hạn như

-- test.hs 

-- main :: IO() 
main = print (1 :: Int) 

GHC không đưa ra cảnh báo:

$ ghc -Wall test.hs 
[1 of 1] Compiling Main    (test.hs, test.o) 

test.hs:2:1: Warning: 
    Top-level binding with no type signature: main :: IO() 
Linking test ... 
$ 

Tôi đang bối rối ... Nếu chữ ký loại cho main thực sự là thừa, tại sao -Wall khiến GHC khiếu nại khi chữ ký bị thiếu? Có lý do chính đáng nào (ngoài việc loại bỏ cảnh báo đó) để chỉ định loại của main không?

+0

Thiếu chữ ký loại cấp cao nhất phải là lỗi. Trong thực tế nó phải là bất hợp pháp. – Shoe

+4

Bất hợp pháp như trong nên bị trừng phạt như một tội phạm. Không phải bất hợp pháp trong ngôn ngữ. – Shoe

+1

Đặc biệt, chữ ký loại * xuất * cấp cao nhất có thể là lỗi. Tôi sử dụng rất nhiều người giúp việc rất chung chung không được xuất khẩu, không có tài liệu công khai và chữ ký của họ dài hơn cơ thể của họ. Viết ra những điều không giúp gì cả và chỉ là một sự khó chịu. –

Trả lời

13

Vâng, nói chung, khi cảnh báo đó rõ ràng, đó là luôn luôn một ý tưởng hay là cung cấp cho các liên kết cấp cao nhất chữ ký loại. Trong thực tế, nó sẽ là hợp lý hơn để nói

Theo quy ước, chúng tôi xác định một bản tuyên bố kiểu cho tất cả mọi thứ .

Chắc chắn, trong một dự án lớn, main chính nó tạo nên một nỗ lực không thể bỏ qua, vì vậy thực sự không có ý nghĩa gì khi bỏ qua chữ ký. Chỉ cần viết nó ra, vì lợi ích của sự nhất quán. Tuy nhiên, mặc dù Haskell là rất tốt cho các dự án có cấu trúc đúng và thực sự có xu hướng viết hầu hết mọi thứ trong các thư viện , nó cũng đáng ngạc nhiên là một ngôn ngữ kịch bản nhanh, cho những thứ mà người khác viết bằng Python hoặc Perl. Và trong những trường hợp đó, bạn thường không quan tâm nhiều đến vấn đề an toàn và tài liệu tốt, v.v., bạn chỉ muốn viết nhanh một cái gì đó ngắn gọn nhất có thể để thực hiện công việc. Bạn cũng thường không biên dịch các tập lệnh đó với -Wall nhưng chỉ thực thi chúng với runhaskell. Và như kịch bản luôn cần phải chứa một main (không giống như hầu hết các tệp nguồn Haskell khác), nó thực sự là đủ hợp lý để bỏ qua chữ ký ở đây.

Tôi vẫn nghi ngờ rằng phần lớn người bán Haskellers hiện nay là làm viết main::IO() ngay cả trong các tập lệnh đơn giản nhất, nếu không có thói quen.


Chỉ mọi thứ trên cấp cao nhất, đó là. Các chữ ký địa phương đôi khi cũng có ý nghĩa, nhưng chúng thường làm xáo trộn mã.

+0

Cảm ơn bạn đã làm rõ. – Jubobs

+0

Ngoài ra đối với các dự án lớn hơn, bạn nên bật '-fwarn-missing-signatures' và' -Werror', sau đó buộc 'main' có chữ ký kiểu. –

+1

@ PetrPudlák Tôi thường sử dụng '-Wall' (cho phép' -fwarn-missing-signatures', tôi tin) kết hợp với '-Werror'. – Jubobs

8

Nó thực sự là một ý tưởng rất tốt để viết một chữ ký kiểu cho main, vì nếu không thì nếu bạn nhận được quá ưa thích cố gắng để viết những điều dưới dạng point-miễn phí, bạn có thể kết thúc với main loại IO (IO()).Điều này được chấp nhận (tiêu chuẩn ngôn ngữ nói main chỉ cần có một số loại biểu mẫu IO a) nhưng "hành động IO bên trong" là kết quả của main sẽ bị loại bỏ, gần như chắc chắn không phải những gì bạn muốn (có thể bạn muốn để join nó).

+0

Thú vị. Bạn có thể thêm một liên kết đến nơi, trong tiêu chuẩn, bạn đọc rằng * 'main' chỉ cần có một số loại hình thức' IO a' *? – Jubobs

+0

@Jubobs: xem đoạn thứ hai của https://www.haskell.org/onlinereport/haskell2010/haskellch5.html#x11-980005 –

+0

Phát ngay. Cảm ơn. – Jubobs

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