有没有办法为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
答案 0 :(得分:1)
我认为GHC目前不支持派生大多数复杂类型的实例(即只能用扩展名编写的类型)。但是,手动编写此实例的方法比您在此处建议的方法更为简洁。您可以调度到Main.show
和(Main.==)
,而不是创建新的Prelude.show
和(Prelude.==)
,前提是您告诉编译器这没关系。要做到这一点,就要制作Show
的{{1}}和Eq
个超类:
Country
然而,正如我们从class (Show a, Eq a) => Country a
的历史中了解到的那样,您通常希望将这种负担转移到其他地方。所以,你的另一个选择是将这些约束放在你的存在主义中:
Num
再往后退一步,你也很可能不应该在这里使用存在感;它们经常是不必要的。但是,如果没有更多的背景,很难提供更有针对性的重构建议。