2012-05-24 28 views
7

Tôi cần bản đồ có thể chứa các giá trị tùy ý miễn là các loại của chúng có cùng kiểu chữ. Cách tiếp cận ngây thơ đầu tiên của tôi là một cái gì đó như thế này:Bản đồ không đồng nhất

type HMap = forall a . MyClass a => M.Map Int a 

nhưng nó dường như không làm việc: đoạn mã sau đưa ra một lỗi biên dịch:

testFunction :: (forall a . MyClass a => M.Map Int a) -> Int -> IO() 
testFunction m i = do 
    case M.lookup i m of 
     Nothing -> return() 
     Just v -> someActionFromMyClass v >> putStrLn "OK" 


Ambiguous type variable `a0' in the constraint: 
    (MyClass a0) arising from a use of `m' 
Probable fix: add a type signature that fixes these type variable(s) 
In the second argument of `M.lookup', namely `m' 
In the expression: (M.lookup i m) 
In a stmt of a 'do' block: 
    case (M.lookup i m) of { 
    Nothing -> return() 
    Just v -> someActionFromMyClass v >> putStrLn "OK" } 

Tôi nghĩ rằng tôi cần phải thu không đồng nhất đặc biệt, nhưng kỳ lạ Tôi không thể tìm thấy bất kỳ thứ gì trong Google ngoại trừ this, nhưng thư viện này có vẻ hơi thô lỗ và cũ kỹ. Cách để thực hiện điều này một cách chính xác (hy vọng không có thư viện nào khác, chỉ sử dụng phần mở rộng GHC)?

Trả lời

9

Thử sử dụng loại tồn tại phù hợp.

{-# LANGUAGE ExistentialQuantification #-} 

data Elem = forall e. C e => Elem e 

type HMap = Map Int Elem 
+0

Cảm ơn bạn rất nhiều! Đó là một sự xấu hổ tôi đã không có nó bản thân mình. Tôi đoán tôi phải ngủ nhiều hơn tôi bây giờ) –

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