0

我在构造函数中定义了一个可以接受 Dynamics的数据类型Loc 。此外,我需要使用 == 运算符比较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)

任何想法?

4

1 回答 1

4

请阅读您的编译器警告 :) 您没有为Typeable类型类的typeOf方法DynamicLocationtoDyn调用提供定义typeOf。所以这绝对不应该工作——如果你尝试 just toDyn Loc_1,你会得到一个例外。

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

该怎么办?我建议让 GHCTypeable为您派生实例:

{-# 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)

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

于 2013-08-20T16:38:38.713 回答