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'
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ẽ. –
Ý 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