0

コンストラクターでダイナミクスを受け入れることができるデータ型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メソッド for DynamicLocation、およびtoDyncallsの定義を提供していませんtypeOf。したがって、これは絶対に機能しないはずです。ただ試してみるとtoDyn Loc_1、例外が発生します。

しかし、なぜ無限ループになるのでしょうか? これは、 for も定義していない(==)ため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)

ただし、コメンターがすでに指摘しているように、(==)forを定義する方法Dynamic、またはこれが可能かどうかはすぐには明確ではありません。

于 2013-08-20T16:38:38.713 に答える