Haskell 中类型参数的正确类型签名

Right type signature for type parameter in Haskell

我有两种数据类型,想写一个 class returns 来自这些数据类型的数据:

data D1 a = Da1 a | Db1 a 
data D2 a = Da2 a | Db2 a 

class D a where
    extract :: ??? a -> a

instance D (D1 a) where
    extract (Da1 a) = a
    extract (Db1 a) = a

instance D (D2 a) where
    extract (Da2 a) = a
    extract (Db2 a) = a

如果我只有一个类型 D1 或 D2 我可以在类型签名中命名它,但是在有多种可能性的情况下我该怎么办?这甚至可能吗?

您需要创建 DD1D2 个实例,而不是 D1 aD2 a。然后你可以在 a 上量化 extract 并使 extract return 从 D 中得到 a 所有 a.

因为这可能不是很清楚(抱歉):

class D d where
    -- `d` is the type constructor that's an instance of `D` (i.e. `D1` or
    -- `D2`) and `a` is a new type variable that can be any possible type
    extract :: d a -> a

instance D D1 where
    extract (Da1 a) = a
    extract (Db1 a) = a