2011-02-05 8 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

タイプのパターンマッチングはできません。あなたはパターンマッチは、あなたがGADTsを使用することができ、型パラメータのための証拠を提供したい場合は

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

:何ができることは、このような型クラスを使用している

{-# 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が提案したものに比べてどのような利点があるのか​​よく分かりません。あなたのサンプルコードにminalの変更を加えて尋ねたものを提供します:-)

関連する問題