Tôi có một loạt các hàm hoạt động trên Vectơ, tức là các danh sách có độ dài được thực thi kiểu.Khai báo các thể hiện của các từ đồng nghĩa loại tham số
Tôi đang cố gắng để làm cho loại của tôi dễ dàng hơn để viết, tức là thay vì viết
foo :: (Fold Integer v, Map Integer Integer v v, ...) => ...
Tôi đang khai báo một lớp mới NList
vì vậy tôi chỉ có thể viết foo :: NList v Integer => ...
The (giản thể) lớp trông như thế này:
class (Fold (v i) i
, Map i i (v i) (v i)
, Map i (Maybe i) (v i) (v (Maybe i))
) => NList v i
như bạn thấy, tôi phải giữ "vector" kiểu tách biệt với "mục" loại (tức là v
riêng biệt từ i
) để tôi có thể làm những việc như Map
lên một vector Maybe
.
Như vậy, v
phải có loại * -> *
và i
loại *
.
Tuy nhiên, khi tôi cố gắng nhanh chóng nó với vectơ như vậy:
instance NList Vec2 Integer
instance NList Vec3 Integer
...
tôi nhận được lỗi sau:
Type synonym `Vec2' should have 1 argument, but has been given none
In the instance declaration for `NList Vec2 Integer'
Bây giờ, tôi rất mới để nhập cấp lập trình, và tôi hiểu rằng tôi có thể làm điều này theo cách rất lạc hậu. Có thể khởi tạo một từ đồng nghĩa kiểu như thế này không? Có bất kỳ trình thủ thuật loại nào có đề xuất cho các cách tốt hơn để hoàn thành mục tiêu của tôi không?
Rất tuyệt, cảm ơn. Một điều tôi không nhận được là ví dụ cuối cùng. Có chuyện gì với toán tử Tilda? – So8res
Đó là [ràng buộc bình đẳng] (http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/equality-constraints.html). Nếu bạn có một hạn chế 'Num a' trong phạm vi, bạn có thể sử dụng toán tử số học trên các giá trị của kiểu' a'; nếu bạn có một giới hạn '(a ~ b)' trong phạm vi, bạn có thể sử dụng các giá trị 'a' làm giá trị' b' và ngược lại. Về cơ bản, bạn có thể đọc '(n ~ Z) => r' là" chứng minh với tôi rằng 'n' là' Z', và tôi sẽ cho bạn một 'r'". – ehird