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

6 haskell typeclass

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

class MyTypeclass (ctor a b) where
  funct :: (ctor a b) -> a
Run Code Online (Sandbox Code Playgroud)

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

data Pair a b = Pair a b
Run Code Online (Sandbox Code Playgroud)

能够做类似的事情

instance MyTypeclass (Pair a b) where
  funct :: Pair a b -> a
  funct (Pair x _) = x
Run Code Online (Sandbox Code Playgroud)

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

Ing*_*ngo 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
Run Code Online (Sandbox Code Playgroud)

  • 当然,只需在类memeber的类型sigber中用`Pair`替换`ctor`. (2认同)