Testando as propriedades do QuickCheck em vários tipos?

Eu tenho uma classe de tipoAtomic, que define funções para converter certos tipos de / para um valor de invólucro (Atom). Gostaria de definir uma propriedade QuickCheck que declara: "para todas as instâncias deAtomic, qualquer valor pode ser armazenado e recuperado com segurança ". A propriedade é assim:

class Atomic a where
    toAtom :: a -> Atom
    fromAtom :: Atom -> Maybe a

prop_AtomIdentity x = fromAtom (toAtom x) == Just x

No entanto, se eu tentar executar essa propriedade por meio do QuickCheck, ele apenas selecionará uma instância (Bool) e testa isso. Atualmente estou trabalhando em torno disso definindo assinaturas de tipo para cada tipo atômico suportado na lista de teste, mas isso é detalhado e propenso a erros:

containerTests =
    [ run (prop_AtomIdentity :: Bool -> Bool)
    , run (prop_AtomIdentity :: Word8 -> Bool)
    , run (prop_AtomIdentity :: String -> Bool)
    {- etc -} ]

Estou tentando definir uma função que fará isso automaticamente:

forallAtoms :: (Atomic a, Show a) => (a -> Bool) -> [TestOptions -> IO TestResult]
forallAtoms x =
    [ run (x :: Bool -> Bool)
    , run (x :: Word8 -> Bool)
    , run (x :: String -> Bool)
    {- etc -} ]

containerTests = forallAtoms prop_AtomIdentity

Mas falha com um erro de verificação de tipo:

Tests/Containers.hs:33:0:
    Couldn't match expected type `Word8' against inferred type `String'
    In the first argument of `run', namely `(x :: Word8 -> Bool)'
    In the expression: run (x :: Word8 -> Bool)
    In the expression:
        [run (x :: Bool -> Bool), run (x :: Word8 -> Bool),
         run (x :: String -> Bool)]

Existe uma maneira melhor de testar uma propriedade de controle de qualidade em vários tipos? Se não, pode oallAtoms ser feito para funcionar ou não é suportado pelo sistema de tipos?

questionAnswers(1)

yourAnswerToTheQuestion