2017-01-21 29 views
5

Duyệt haddocks các gói khác nhau tôi thường đi cùng các tài liệu ví dụ mà trông như thế này (Control.Category):gì * (sao) hoặc các loại khác có nghĩa là trong một danh sách thể hiện của Haddock

Category k (Coercion k) 
Category * (->) 

hay này (Control.Monad.Trans.Identity):

MonadTrans (IdentityT *) 

Chính xác chữ ký loại này có ý nghĩa gì? Nó không hiển thị trong nguồn, nhưng tôi đã nhận thấy rằng nó dường như xảy ra trong các mô-đun sử dụng tiện ích mở rộng PolyKinds. Tôi nghi ngờ nó có lẽ giống như một TypeApplication nhưng với một loại. Vì vậy, ví dụ: ví dụ cuối cùng có nghĩa là IdentityT là một biến áp đơn lẻ nếu đối số đầu tiên của nó có loại *.

Vì vậy, câu hỏi của tôi là:

  • là giải thích của tôi chính xác và chính xác những gì không chữ ký loại tham khảo?
  • Trong ví dụ Category đầu tiên, làm thế nào để tôi biết rằng k là một loại và không phải là một loại? Hay tôi chỉ cần biết sự tinh thần của Category?
  • Mã nguồn tương tự với cú pháp này là gì?

Tôi không yêu cầu giải thích về các loại.

Trả lời

4

To quote Richard Eisenberg’s recent post on the haskell-cafe mailing list:

Haddock đấu tranh đôi khi để render các loại với -XPolyKinds kích hoạt. Vấn đề là GHC thường không yêu cầu các đối số loại được viết và nó không in ra (trừ khi bạn nói -fprint-explicit-kinds). Nhưng Haddock, tôi tin rằng, in ra các loại bất cứ khi nào -XPolyKinds được bật. Vì vậy, hai định nghĩa khác nhau thực sự giống nhau: chỉ có một mô-đun có -XPolyKinds và một định nghĩa khác thì không.

* là loại bình thường. Vì vậy, Int có loại * (chúng tôi viết Int :: *) trong khi Maybe có loại * -> *. Typeable thực sự có loại forall k. k -> Constraint, có nghĩa là nó được polykinded. Trong đoạn đầu tiên bên dưới, đối số * đến Typeable instantiates k với *, vì biến loại a có loại *.

Vì vậy, như bạn đã đoán, nó phải làm với PolyKinds. Haddock ám các loại đa dạng này với một loại "ứng dụng loại rõ ràng". Nó chỉ như vậy xảy ra rằng Category là poly-kinded, có loại forall k. (k -> k -> *) -> Constraint, do đó, Haddock ám ứng dụng loại cùng với mỗi trường hợp.

Theo ý kiến ​​của tôi, đây là lỗi hoặc lỗi của Haddock, vì không có mã nguồn tương tự tương tự như tôi biết. Thật khó hiểu và tôi không biết cách nào tốt hơn để hiểu nó hơn là nhận ra cách nó thường biểu hiện và trực quan suy ra những gì đang diễn ra từ ngữ cảnh.

+2

Đồng ý, tôi cũng xem đây là lỗi. Có thể sử dụng 'Danh mục @k (Coercion k)' sẽ là một ký hiệu tốt hơn. – chi

+0

Có những trường hợp cần xác định loại biến không có trong loại. Sự kết hợp đó khiến cho việc tìm kiếm một cách tài liệu thật sự khó khăn. – Carl

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