保证类型系列将派生某些类

So8*_*res 5 haskell type-families

我有以下内容:

{-# LANGUAGE TypeFamilies #-}

class Configuration c where
    data Pig c
    data Cow c

    parsePig :: GenParser Char st (Pig c)
    parseCow :: GenParser Char st (Cow c)

data Farm c =
    { pigs :: [Pig c]
    , cows :: [Cow c]
    } deriving Show
Run Code Online (Sandbox Code Playgroud)

由于这deriving Show条线,这失败了.我不知道如何强制所有Configuration实例确保它们data Pigdata Cow实现都是实例Show.

我知道我可以创造它showPigshowCow方法,并写出整个复杂的show实例,但实际上事情比这更复杂,这将是一个非常痛苦.

是否有一种简单,优雅的方法来保证类型族实例本身就是某些类的实例?

ham*_*mar 8

您可以使用StandaloneDeriving仅为Show实例手动指定约束.

{-# LANGUAGE StandaloneDeriving, FlexibleContexts, UndecidableInstances #-}
deriving instance (Show (Pig c), Show (Cow c)) => Show (Farm c)
Run Code Online (Sandbox Code Playgroud)

但是,只要您不尝试Configuration实例,这仍然会让您拥有实例Cow并且Pig不实现实例.Showshow