Haskell:多类型变量的数据实例?

Haskell:多类型变量的数据实例?,haskell,typeclass,Haskell,Typeclass,我想为各种类型的“资料列”创建一个类型类,如下所示: class Column c where at :: c a -> Int -> a data ListColumn a = ListColumn { lcContent :: [a] } instance Column ListColumn where at c i = lcContent c !! i instance Column (DerivedColumn a b) where at

我想为各种类型的“资料列”创建一个类型类,如下所示:

class Column c where
     at :: c a -> Int -> a

data ListColumn a = ListColumn {
     lcContent :: [a]
}

instance Column ListColumn where
  at c i = lcContent c !! i
instance Column (DerivedColumn a b) where
    at c i = dcDerive c $ at (dcBase c) i
现在我想从另一列派生一列。假设我有一列客户,我想从中导出一列客户名称。于是我写道:

data DerivedColumn a b c = DerivedColumn {
    dcBase   :: c a, 
    dcDerive :: a -> b
}
a
是客户,
b
是上例中的客户名称。现在我想我可以这样写:

class Column c where
     at :: c a -> Int -> a

data ListColumn a = ListColumn {
     lcContent :: [a]
}

instance Column ListColumn where
  at c i = lcContent c !! i
instance Column (DerivedColumn a b) where
    at c i = dcDerive c $ at (dcBase c) i

但ghc似乎不喜欢它(
列应该有kind*->*,而派生列a b有kind(*->*)->*
)。有人能指出正确的方向吗?

我想你想要的是:

data DerivedColumn c a b = DerivedColumn {
    dcBase   :: c a, 
    dcDerive :: a -> b
}

instance Column c => Column (DerivedColumn c a) where
    at dc i = dcDerive $ at (dcBase dc) i

展开一点,如果您查看
类,您将看到
c
具有种类
*->*
,并且
ca
中的
a
c
包含的值的类型。我假设
DerivedColumn a b c
包含的列的值应该具有类型
b
,因此它应该是您传递给类型构造函数的最后一个值,以便您定义
列的实例

data DerivedColumn c a b = DerivedColumn {
    dcBase   :: c a, 
    dcDerive :: a -> b
}

instance Column c => Column (DerivedColumn c a) where
    at dc i = dcDerive $ at (dcBase dc) i

展开一点,如果您查看
类,您将看到
c
具有种类
*->*
,并且
ca
中的
a
c
包含的值的类型。我假设
DerivedColumn a b c
包含的列的值应该具有类型
b
,因此它应该是您传递给类型构造函数以定义
列的实例的最后一个值,但是看起来您可能需要从
DerivedColumn
中洗牌类型变量,以使容器类型
a
,最后?所以定义应该是
数据派生列c b a=…
typeclass需要一个可以应用容器类型的类型,以获得具体类型。是的,这很有意义,谢谢!我有点不清楚您到底想要什么,但看起来您可能需要从
DerivedColumn
中洗牌类型变量,以获得容器类型,
a
,最后一个?所以定义应该是
数据派生列c b a=…
typeclass需要一个可以应用容器类型的类型,以获得具体类型。是的,这很有意义,谢谢!我补充了一些解释。如果你有问题,请告诉我。我补充了一些解释。如果你有问题,请告诉我。