2013-10-28 18 views
6

GHC cảnh báo rằng tôi không có chữ ký chức năng ở cấp cao nhất. Tôi không hiểu tại sao tôi cần chúng. Vấn đề với cung cấp cho họ là họ là khá phức tạp, như thế này (autogenerated):Tại sao các chức năng cấp cao nhất của tôi cần chữ ký trong Haskell?

applyValue :: forall t t1 t2 t3 t4. 
       (t2 -> t) 
       -> (t2 -> t3 -> t4 -> t1) -> t2 -> t3 -> t4 -> (t -> Bool) -> [t1] 

Vậy tại sao tôi sẽ làm phiền thêm chúng?

chức năng chính:

applyValue getValueAt stitchAndMove at fabric mark matchAt = 
    if matchAt (getValueAt at) 
    then [stitchAndMove at fabric mark] 
    else [] 
+0

Bạn đã bật bất kỳ tiện ích mở rộng nào chưa? –

+0

Chúng ta có thể thấy một số mã không? – jozefg

+6

Nếu điều này xảy ra vì bạn đang biên dịch với '-Wall', bạn có thể sử dụng' -fno-warn-missing-signatures'. Nó được coi là thực hành tốt không để chúng ra - xem câu trả lời của Daniel Wagner vì lý do tại sao. –

Trả lời

22
  • Như một hình thức tài liệu máy checkable. Nếu bạn cho rằng loại đó là đúng loại, hãy đặt nó ở đó yêu cầu trình biên dịch kiểm tra lại xem bạn đã không tạo giao diện riêng cho mình trong các phiên tái cấu trúc không thể tránh khỏi sau này.
  • Là tài liệu có thể đọc được bằng con người. Mặc dù như bạn quan sát, khi bạn nhận thấy bạn đang viết một loại máy được tạo ra khủng khiếp, có lẽ là lúc để suy nghĩ về những gì (loại cấp) trừu tượng bạn cần để làm cho nó dễ đọc.
  • Đối với mã khóa. Nhận xét của Haddock gắn liền với chữ ký loại, không phải ràng buộc, vì vậy nếu bạn để lại chữ ký kiểu, tài liệu viết tay cẩn thận của bạn sẽ bị bỏ qua một cách thầm lặng.
  • Để cải thiện thông báo lỗi và kết quả truy vấn ghci: mặc dù tên biến thực tế không quan trọng, GHC cố gắng bảo toàn tên khi chúng được người dùng cung cấp. Một cái gì đó giống như (node -> Bool) -> (edge -> Bool) -> (graph -> Bool) có thể dễ đọc hơn (t1 -> Bool) -> (t2 -> Bool) -> (t3 -> Bool), mặc dù chúng tương đương nhau.
+1

Điểm của bạn có ý nghĩa, tôi có một câu hỏi nhanh khác, có cách nào để sử dụng lại các khối chữ ký, nói rằng tôi có chữ ký của hàm f1 dài và tinh vi, bây giờ f2 lấy f1, nên mọi thứ về f2 + là. Tôi tự hỏi nếu tôi có thể tiết kiệm một số công việc bằng cách gán chữ ký f1 cho một số tên (loại?) Và đề cập đến nó bằng tên đó khi tôi xác định chữ ký của f2. Cảm ơn –

+6

@AlekseyBykov Vâng, đây là những gì 'loại' bí danh làm. Bạn có thể đọc về chúng trong Báo cáo hoặc hướng dẫn yêu thích của bạn. –

+1

Chữ ký đôi khi cần thiết ngay cả khi bạn không quan tâm đến tài liệu hoặc thông báo lỗi. Đôi khi nó là mơ hồ những gì thể hiện của một loại lớp bạn muốn, và do đó bạn cần phải ràng buộc một cách rõ ràng nó để biên dịch. – newacct

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