2011-02-05 17 views
2

模式匹配類型參數比方說,我有這樣的:如何指定幻象型

data PT1 
data PT2 
data DT1 a = DT1 { field :: Int } 

newtype DT2 a = DT2 (DT1 a) 

f :: Int -> DT2 a -> Int 
f x (DT2 (DT1 PT1 field)) = 5 -- How do I specify the type param? 
f x (DT2 (DT1 PT2 field)) = 7 -- How do I specify the type param? 

的問題是,有沒有意見。以上不編譯。我想根據類型參數對模式進行不同的匹配。我該怎麼做?

回答

3

您無法對類型進行模式匹配。你可以做的是使用這樣的類型類:

class Effable t where 
    f :: Int -> t -> Int 

instance Effable (DT2 PT1) where 
    f x (DT2 _) = 5 

instance Effable (DT2 PT2) where 
    f x (DT2 _) = 7 
0

如果你想有一個模式匹配的類型參數提供證據,你可以使用GADTs:

{-# LANGUAGE GADTs #-} 

data PT1 
data PT2 

data Tag a where 
    PT1 :: Tag PT1 
    PT2 :: Tag PT2 

data DT1 a = DT1 { tag :: Tag a, field :: Int } 

newtype DT2 a = DT2 (DT1 a) 

f :: Int -> DT2 a -> Int 
f x (DT2 (DT1 PT1 field)) = 5 
f x (DT2 (DT1 PT2 field)) = 7 

但現在的類型不再是一個幻影類型 - 你帶着一個運行時標籤。

我不確定這與@ sepp2k建議的內容有什麼優勢,或者即使這會有用。它只是給你你所要求的最小修改你的示例代碼:-)