2012-04-23 32 views
6

Tôi có loại dữ liệu mà tôi quảng cáo qua DataKinds trong ghc 7.4.1 và một kiểu chữ đã cho mà tôi muốn sử dụng để thực hiện các hoạt động cụ thể.Làm cách nào để tạo các trường hợp typeclass của một loại được quảng cáo?

data Type = TInt32 | TInt64 | TInt16 
class TypeTraits a where 
    ... 

Và sau đó tôi cố gắng tạo ra các trường hợp typeclass các loại bạt như vậy:

instance TypeTraits TInt32 where 
    ... 

tôi nhận được lỗi của các loại sau đây:

Kind mis-match 
The first argument of `TypeTraits' should have kind `*', 
but `TInt32' has kind `Type' 
In the instance declaration for `TypeTraits TInt32' 

cố gắng để khắc phục điều này bằng cách xác định loại 'a':

class TypeTraits (a :: Type) where 
    ... 

Kind mis-match 
Expected kind `ArgKind', but `a' has kind `Type' 
In the type `a -> String' 
In the class declaration for `TypeTraits' 
+0

Chính xác bạn có thể đưa vào vùng '...' là gì? 'TInt32' không phải là một kiểu dân cư, vì vậy nó không thể sử dụng' a' bởi chính nó ở một vị trí giá trị. Tôi đoán một cái gì đó như 'crazyThing :: TypeTraits a => SomeTypeConstructor a'? Tôi có một thời gian khó tưởng tượng ra một cái gì đó như thế này có thể hữu ích, mặc dù nếu tôi thực sự căng ra, tôi có thể tưởng tượng nó là hữu ích * bằng cách nào đó *. Có lẽ. –

+0

Ý tưởng là có những đặc điểm cho từng trường hợp. Vì vậy, tôi không tìm kiếm giá trị, nhưng chỉ đơn thuần là một trình giữ chỗ để chỉ định typeclass và do đó chức năng mà tôi muốn chọn ở đó. ví dụ: 'loại ClassTraits (a :: Type) trong đó loại HType a sizeOf :: Proxy a -> Int' – Chetan

Trả lời

7

Vấn đề nằm trong phần thân của lớp; các loại có loại được nâng lên không có bất kỳ giá trị nào, do đó, bạn không thể có hàm nào lấy một tham số. Bạn sẽ phải sử dụng Proxy a -> String hoặc tương tự.

Nhân tiện, nếu bạn bật tiện ích mở rộng PolyKinds thì bạn sẽ có thể bỏ qua hoàn toàn chú thích loại. (Trên thực tế, bạn có thể phải làm điều này, để xác định loại Proxy của riêng mình, vì tôi nghĩ rằng loại dữ liệu đó từ Data.Proxy có thể là * -> *, trong khi bạn cần Type -> *. AnyK -> *.)

+1

Kiểu dữ liệu proxy trong [paper] (http://research.microsoft.com/en-us/ người/dimitris/fc-kind-poly.pdf) cuối cùng cũng có ý nghĩa, cảm ơn! – Chetan

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