Hãy giả sử tôi có một lớp kiểu Stack
với một ví dụ List
:Nhiều thông số loại trong lớp loại?
class Stack a where
push :: a -> Integer -> a
pop :: a -> a
last :: a -> Integer
data List = Empty | Element Integer List
instance Stack List where
push list value = Element value list
pop Empty = error "No elements"
pop (Element _ list) = list
last Empty = error "No elements"
last (Element value _) = value
Làm thế nào Stack
đã được xác định theo thứ tự cho List
để không bị giới hạn Integer
giá trị?
-- class Stack (?) where ...
data List a = Empty | Element a (List a)
-- instance Show (List a) where ...
Trước đó, tôi thực sự đã thử cú pháp tương tự, nhưng chỉ viết 'instance Stack (List a)'. Và tôi quên gắn thêm 'FlexibleInstances' vào pragma. Bây giờ nó hoạt động, cảm ơn bạn :) – Cubinator73
Nếu mỗi 'a' thừa nhận nhiều nhất một' b' sao cho 'Stack a b' có một cá thể, một phụ thuộc chức năng' a-> b' có thể giúp loại máy inference đáng kể. Nếu không, mỗi cuộc gọi đến 'pop :: a -> a' là mơ hồ:' b' không thể được xác định từ ngữ cảnh của 'pop'. (Các gia đình kiểu cũng có thể được sử dụng, tất nhiên.) – chi
@chi: IIRC bạn có thể thêm các hạn chế, như vậy sẽ chỉ có một 'b' cho' a'. Sẽ tra cứu sau. –