Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell:从其他typeclass派生的typeclass_Haskell - Fatal编程技术网

Haskell:从其他typeclass派生的typeclass

Haskell:从其他typeclass派生的typeclass,haskell,Haskell,假设我有一个typeclass用于保存在数据库中的实体。一些简化示例可能如下所示: class Persistent a where fetch :: Int -> IO (Maybe a) store :: a -> IO Bool class Persistent a deriving (Typeable) where fetch :: Int -> IO (Maybe a) store :: a -> IO Bool 现在我发现对

假设我有一个typeclass用于保存在数据库中的实体。一些简化示例可能如下所示:

class Persistent a where
    fetch :: Int -> IO (Maybe a)
    store :: a -> IO Bool
class Persistent a deriving (Typeable) where
    fetch :: Int -> IO (Maybe a)
    store :: a -> IO Bool
现在我发现对于
store
我可能需要知道实体的类型,因此它也应该是
可键入的

是否有某种方法可以判断所有的
持久性
实体都是
可键入的
,而不向每个特定的
数据
子句添加
派生(可键入)
?例如,像这样:

class Persistent a where
    fetch :: Int -> IO (Maybe a)
    store :: a -> IO Bool
class Persistent a deriving (Typeable) where
    fetch :: Int -> IO (Maybe a)
    store :: a -> IO Bool

不,这是不可能的

在类a中,a不必表示数据类型声明。这只是一种类型。例如,可以为
可能的整数添加一个
持久性
实例

instance Persistent (Maybe Integer) where ...
因此,谈论“将
派生(可键入)
子句添加到所有碰巧是
持久的
a
子句中”没有多大意义。不能说
数据可能是整数派生的Typeable
或诸如此类的东西


如果您完全确定每个
持久性
对象都必须是可键入的
,那么您可能需要向
持久性
类添加一个约束:

class Typeable a => Persistent a where ...

但是,这对自动派生
Typeable
没有任何帮助。它只要求对于每个
持久的
实例,都应该有一个
可键入的
实例,您仍然需要以某种方式生成自己的实例(例如,通过向所有相关数据类型添加
派生(可键入)

那么
派生实际上只是自动生成一个实例。但是您可以编写
类Typeable a=>Persistent a where…
。不,这是不可能的。在
类持久化a
中,
a
不必表示数据类型声明。这只是一种类型。例如,您可以将一个
持久
实例添加到
可能是整数
。因此,谈论“将一个
派生Typeable
子句添加到所有碰巧是
持久的
a
子句中”没有多大意义---您不能说
数据可能是整数派生的Typeable
或诸如此类的东西。@WillemVanOnsem
class Typeable a=>Persistent a
添加了一个约束,即
Persistent
的任何内容也必须是
Typeable
。它可能是需要的,但它不能帮助您满足约束。您仍然需要以这种或那种方式生成
Typeable
实例(例如,将
派生(Typeable)
添加到所有相关的
数据
子句中)。@n.m感谢您的解释,请随意回答,以便我可以“接受”它!还要感谢您澄清向typeclass添加约束并没有帮助:)但您为什么需要这样做呢?在每个特定的实例中,您都知道类型——您只是在实例声明中写下了它
Typeable
可能是一个特殊的例子,因为在现代GHC中,所有东西都隐式地是
Typeable
类的成员,
派生Typeable
是不可操作的。因此,超类约束已经足够好了,并且实际上是“免费的”,除了传递字典的运行时成本。