比较两种动态类型时的Stackoverflow异常

时间:2013-08-20 15:32:36

标签: haskell dynamic equals

我已经定义了一个数据类型 Loc ,它可以在构造函数中接受Dynamics。此外,我需要使用==运算符比较 Loc 数据类型。所以我想出了类似的东西:

data Loc = UnknownLoc | DynamicLoc Dynamic deriving (Eq,Show)
instance Eq Dynamic
data DynamicLocation = Loc_1 | Loc_2 deriving (Eq,Show)
instance Typeable DynamicLocation

但是当试图运行以下行时,我得到了stackoverflow异常。

DynamicLoc (toDyn Loc_1) == DynamicLoc (toDyn Loc_1)

任何想法?

1 个答案:

答案 0 :(得分:4)

请阅读您的编译器警告:)您尚未为TypeabletypeOf调用DynamicLocation提供toDyn类型类typeOf方法的定义}。所以这绝对不行 - 如果你只试试toDyn Loc_1,你会得到一个例外。

但为什么是无限循环呢?这是因为您还没有为(==)定义Dynamic(==)(/=)GHC.Classes中相互定义。 GHC不会尝试在默认方法声明中解决此类无限递归,因此您不会收到警告。

怎么办?我建议让GHC为你推导出Typeable个实例:

{-# LANGUAGE StandaloneDeriving, DeriveDataTypeable #-}

data DynamicLocation = Loc_1 | Loc_2 deriving (Eq,Show)
deriving instance Typeable DynamicLocation

或更明智:

{-# LANGUAGE DeriveDataTypeable #-}
data DynamicLocation = Loc_1 | Loc_2 deriving (Eq,Show,Typeable)

但是,正如评论者已经指出的那样,目前尚不清楚如何为(==)定义Dynamic,或者这是否可能。