2013-07-05 43 views
6

Tôi không chắc chắn nếu tiêu đề là mô tả đủ nhưng tôi không phải là rất có kinh nghiệm trong Haskell. Tôi muốn thực hiện một typeclass cho nhà xây dựng kiểu hai tham số mà phụ thuộc vào các loại mà các nhà xây dựng được parametrized, nhưDeconstruction loại trong định nghĩa typeclass (Haskell)

class MyTypeclass (ctor a b) where 
    funct :: (ctor a b) -> a 

(giả sử ctor :: * -> * -> *, a :: *, b :: *) và, giả sử tôi có một

data Pair a b = Pair a b 

có thể làm một cái gì đó giống như

instance MyTypeclass (Pair a b) where 
    funct :: Pair a b -> a 
    funct (Pair x _) = x 

là nó có thể không có nhiều lớp kiểu tham số (vì nó' s quá mạnh mẽ - Tôi chỉ muốn deconstruct loại typeclass của tôi là parametrized bởi)?

Trả lời

7

Có, bạn có thể sử dụng cái gọi là "lớp học xây dựng" mà phải mất loại kinded cao:

class C ctor where 
    funct :: ctor a b -> a 

instance C Pair where 
    funct (Pair x _) = x 

instance C (,) where 
    funct = fst  -- (a,b) -> a 
+0

Cảm ơn! Nó hoạt động. Nhưng tôi khá lo lắng về số lượng suy luận kiểu xảy ra ở đó - làm thế nào tôi có thể tạo ra hai tham số typeclass với hai lớp constructor? Tôi cần một cách để xác định loại nào đến từ đâu. –

+0

Không chắc tôi hiểu mối quan tâm của bạn - nhưng hãy nhớ: Biến lớp (ở đây 'ctor') phải xuất hiện trong mọi chữ ký hàm lớp, và nó phải được áp dụng cho số đối số kiểu đúng. Do đó tất cả các loại được cố định máng đầu vào. – Ingo

+0

Câu hỏi đơn giản hơn sau đó: bạn có thể cho chữ ký rõ ràng của 'funct' bên trong' instance C Pair where'? –