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需要一个可以应用容器类型的类型,以获得具体类型。是的,这很有意义,谢谢!我补充了一些解释。如果你有问题,请告诉我。我补充了一些解释。如果你有问题,请告诉我。