在类型类定义中解构类型(Haskell)

时间:2013-07-05 14:25:49

标签: haskell typeclass

我不确定标题是否足够描述,但我对Haskell的经验不足。我想为双参数类型构造函数创建一个类型类,它取决于构造函数的参数化类型,例如

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

(假设ctor :: * -> * -> *a :: *b :: *),假设我有

data Pair a b = Pair a b

能够做类似

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

是否可能没有多个参数类型类(因为它太强大了 - 我只想解构我的类型类被参数化的类型)?

1 个答案:

答案 0 :(得分:7)

是的,您可以使用所谓的“构造函数类”来获取更高级的类型:

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