2011-12-03 33 views
13

Tôi thích đặt chữ ký kiểu cho tất cả các định nghĩa cấp cao nhất trong mã của mình. Tuy nhiên, việc gõ chữ ký trong các khai báo dụ dường như không được phép, và nếu tôi đặt một chữ ký thì tôi nhận được một lỗi "chữ ký kiểu không đúng chỗ" từ GHC. Tại sao cái này rất? Tại sao GHC không thể kiểm tra xem chữ ký loại có giống với chữ ký mong đợi hay không và từ chối (hoặc cảnh báo) nếu nó không đúng?Tại sao không thể đặt chữ ký loại trong các khai báo dụ trong Haskell?

+3

Trên [vé tôi đã mở] (http://hackage.haskell.org/trac/ghc/ticket/5676) SPJ đã nhận xét: "Tôi đã muốn [loại chữ ký trong khai báo cá thể] bản thân mình, vì vậy tôi đã thực hiện nó trong một khoảnh khắc rảnh rỗi. " Ông hiện đang thiết lập mốc quan trọng cho GHC 7.6, mặc dù có một chút khả năng nó sẽ biến nó thành GHC 7.4. Cảm ơn bạn đã đặt câu hỏi này! Và cảm ơn, Daniel Fischer, vì đã gợi ý rằng chúng tôi làm một tấm vé. –

Trả lời

10

Bạn có thể tạo các hàm riêng biệt, bên ngoài phần thân, nếu bạn thực sự muốn khai báo loại.

class Class a where 
    f1 :: a -> a 

instance Class Foo where 
    f1 = foo_f1 

--monomorphic version of f1 for Foo: 
foo_f1 :: Foo -> Foo 
foo_f1 = ... 
4

Vì chữ ký là một phần của định nghĩa lớp, chữ ký loại trong khai báo cá thể sẽ là chữ ký trùng lặp. Tôi không nghĩ rằng có một vấn đề với việc cho phép các chữ ký trùng lặp về nguyên tắc, nhưng không có lợi thế trong việc cho phép chúng nói chung, và nó đơn giản hơn để không cho phép chúng. Vì vậy, định nghĩa ngôn ngữ cho biết có thể có tối đa một chữ ký loại cho mỗi thực thể. Tính năng cho phép các chữ ký cũng trong các khai báo dụ chưa được yêu cầu nhiều, do đó không có phần mở rộng cho phép nó. Nếu bạn thực sự muốn điều đó, bạn có thể tăng yêu cầu tính năng trên GHC trac. Nếu nó đủ quan tâm, nó có thể được thực hiện (nhưng tôi không mong đợi nhu cầu cao).

+1

Lợi thế sẽ là GHC sẽ kiểm tra chữ ký - lập trình viên có thể khẳng định niềm tin của mình về chữ ký loại và kiểm tra chữ ký, và bị bắt trong trường hợp nó sai. – Prateek

+1

@Prateek Trình biên dịch kiểm tra nó với chữ ký trong lớp. Vì bất kỳ chữ ký nào ngoại trừ chữ ký từ định nghĩa lớp (với các biến kiểu thích hợp được thay thế cho các kiểu cá thể) phải bị từ chối, nó không thể cung cấp thêm thông tin hoặc an toàn. Nó sẽ chỉ là một chút tài liệu bổ sung cho độc giả của mã (đó không phải là một điều xấu, nhưng bạn có thể đạt được nó ngay bây giờ với chữ ký trong ý kiến ​​- Tôi làm điều đó nếu tôi nghĩ rằng các loại không rõ ràng và nổi tiếng). –

+4

Tôi có nghĩa là kiểm tra những gì các lập trình viên tin rằng chữ ký được (ngoài việc kiểm tra đối với chữ ký trong lớp). Điều này không cung cấp thêm bất kỳ sự an toàn nào. Nhưng nó có thể cung cấp cho các thông báo lỗi dễ hiểu hơn: "bạn nghĩ chữ ký kiểu là X, nhưng thực sự nó là Y" thay vì một số lỗi kiểu khác. Ngoài ra, nó cho phép một lập trình viên áp dụng một kiểu đồng nhất của các khai báo kiểu viết, thay vì phải tạo ra một trường hợp đặc biệt để nhận xét nó trong các khai báo cá thể. – Prateek

3

Trong mọi trường hợp, loại là thừa và thường loại bỏ dư thừa. Trong Frege, nó vẫn được phép viết chữ ký cho các thành viên ví dụ. Chúng được kiểm tra và vứt đi. Đó là tất nhiên dễ dàng hơn để cấm chúng ngay lập tức.

+2

Dự phòng đôi khi tốt. – ThePiercingPrince

11

Bạn có thể thêm chữ ký loại cho các phiên bản bằng cách sử dụng [mới] -XInstanceSigs, đặc biệt hữu ích cho việc đưa các biến kiểu trong phạm vi. Bạn có thể tìm thêm thông tin trong số official docs.

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