Haskell派生Eq for Existentials类型类的实例

时间:2012-08-06 17:13:28

标签: haskell typeclass deriving

有没有办法为Power自动派生Eq(和show)的实例? 我找到了http://www.haskell.org/ghc/docs/7.4.2/html/users_guide/deriving.html,但找不到与下面代码相关的任何解释。

此外,如果对下面创建的效果有更好的练习,我愿意接受建议,因为我是haskell和函数式编程的新手。

{-# LANGUAGE ExistentialQuantification #-}

class Country a

instance Country CountrySet1 
data CountrySet1 =
  Belgium | 
  Algeria
    deriving (Show)

data Power =
  forall a. Country a => Power a |
  Netural |
  Water
    deriving (Eq, Show)
编辑:我知道这是一种黑客行为,但由于它几乎全部都是使用前奏函数完成的,所以它应该得到正确的结果,除非有完全恶意的代码(对于&#34来说总是如此)开放世界假设")。

class Country a where
  show :: a -> String

instance Country CountrySet1 where
  show a = Prelude.show a

data CountrySet1  = 
  England | 
  Turkey
    deriving (Show)

data Power = 
  forall a. Country a => Power a |
  Netural |
  Water

instance Show Power where
  show (Power b) = "Power" ++ Main.show b
  show (Netural) = "Netural"
  show (Water) = "Water"

instance Eq Power where
  (==) a b = Prelude.show a == Prelude.show b

1 个答案:

答案 0 :(得分:1)

我认为GHC目前不支持派生大多数复杂类型的实例(即只能用扩展名编写的类型)。但是,手动编写此实例的方法比您在此处建议的方法更为简洁。您可以调度到Main.show(Main.==),而不是创建新的Prelude.show(Prelude.==),前提是您告诉编译器这没关系。要做到这一点,就要制作Show的{​​{1}}和Eq个超类:

Country

然而,正如我们从class (Show a, Eq a) => Country a 的历史中了解到的那样,您通常希望将这种负担转移到其他地方。所以,你的另一个选择是将这些约束放在你的存在主义中:

Num

再往后退一步,你也很可能不应该在这里使用存在感;它们经常是不必要的。但是,如果没有更多的背景,很难提供更有针对性的重构建议。