Type Combinations for Tests

I have a test that I want to run with many types that are are mostly different combinations of types. Is there a good way to simplify this?

main :: IO ()
main = hspec do
  describe "forward" do
    Biparse.BiparserSpec.specForward @(Fwd (StateErrorT (Position UnixLC (), String) (Either ((Position UnixLC (), String), String))))
    Biparse.BiparserSpec.specForward @(Fwd (StateT (Position UnixLC (), String) IO))
    Biparse.BiparserSpec.specForward @(Fwd (StateT (Position UnixLC (), String) IO))
    Biparse.BiparserSpec.specForward @(Fwd (FileT String IO))
    Biparse.BiparserSpec.specForward @(Fwd (FileT String (UpdateState (StateT (Position UnixLC FilePath) IO))))

    Biparse.BiparserSpec.specForward @(Fwd (StateErrorT (Position UnixLC (), Text) (Either ((Position UnixLC (), Text), String))))
    Biparse.BiparserSpec.specForward @(Fwd (StateT (Position UnixLC (), Text) IO))
    Biparse.BiparserSpec.specForward @(Fwd (StateT (Position UnixLC (), Text) IO))
    Biparse.BiparserSpec.specForward @(Fwd (FileT Text IO))
    Biparse.BiparserSpec.specForward @(Fwd (FileT Text (UpdateState (StateT (Position UnixLC FilePath) IO))))

  -- ... just more of the same

Maybe something like
https://hackage.haskell.org/package/arithmoi-0.13.0.0/src/test-suite/Math/NumberTheory/TestUtils.hs

So, basically use lists of types and then use a type function that will combine them in the correct way. Then use a class that will apply the type.