我在Haskell中具有大型类型层次结构。计算家庭实例(毕竟,它们可以具有单独的类成员身份),有[data
类型的由于最顶层的类型需要实现诸如Generic,Eq,Ord,Show
之类的内置类,因此层次结构中的每个单个类型也必须具有有意义的总体实现。因此,我的规范包含数百次deriving (Generic,Eq,Ord,Show)
,我希望避免使文件混乱。
涉及一个单一类型类的解决方案,该解决方案已经具有很多可读性,因此可以将像deriving GEOS
这样的单个类型类自动附加到一个通常的集中位置,并将其自动附加到像C0这样的位置。
Another question要求相似的简洁性是通过使用约束同义词解决的(所以我的GEOS
不仅将链接到我想要的类,而且明确地[[由]]组成),但是apparently当前无法实例化。
(我的一个侧面问题就是为什么会这样。在我看来,关于重命名器的@simonpj gives不知道类型检查器知道该同义词的真正原因仅适用于显式写出的实例。实施。)
也许GHC.Generic
本身(以及类似generic-deriving
的东西在这里可以有所帮助? 我在Haskell中具有大型类型层次结构。计算家庭实例(毕竟可以具有单独的类成员身份),有数百种数据类型。由于最顶层的类型需要实现...
您当然可以使用模板Haskell来生成派生子句为-XStandaloneDeriving
。
{-# LANGUAGE QuasiQuotes #-}
module GEOSDerive where
import Language.Haskell.TH
import Control.Monad
import GHC.Generics
deriveGEOS :: Q Type -> DecsQ
deriveGEOS t = do
t' <- t
forM [ [t|Generic|], [t|Eq|], [t|Ord|], [t|Show|] ] $ \c -> do
c' <- c
return $ StandaloneDerivD Nothing [] (AppT c' t')
然后,
{-# LANGUAGE TemplateHaskell, StandaloneDeriving, QuasiQuotes, DeriveGeneric #-}
import GEOSDerive
data Foo = Foo
deriveGEOS [t|Foo|]
但是,我发现您一开始就需要这么多类型,或者说您有那么多类型,但是每个类型与之关联的代码太少,以至于您不愿意提及这四个类,这有点令人怀疑。他们每个人。这与重构无关,所以我不建议对它们中的每一个都保持deriving (Generic, Eq, Ord, Show)
。