我已经定义了一个数据类型 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)
任何想法?
答案 0 :(得分:4)
请阅读您的编译器警告:)您尚未为Typeable
和typeOf
调用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
,或者这是否可能。