如何在幻像类型的模式匹配中指定类型参数

时间:2011-02-05 20:21:54

标签: haskell pattern-matching type-parameter

假设我有这个:

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?

问题在于评论。以上不编译。我想根据类型参数进行不同的模式匹配。我该怎么做?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果您希望模式匹配提供类型参数的证据,您可以使用GADT:

{-# 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建议的优势有多大,或者即使这样做有用。它只是为您提供了对您的示例代码进行最小修改所要求的内容: - )