obsidiansystems / constraints-extras

Convenience functions and template haskell for working with constraints
http://hackage.haskell.org/package/constraints-extras
Other
9 stars 12 forks source link

deriveArgDict fails for types with many constructors #47

Closed jonathanlking closed 1 year ago

jonathanlking commented 1 year ago

When trying to deriveArgDict for "large" types with many constructors, we can run into the limit of the maximum tuple arity (62) in GHC when collecting constraints.

A toy example of this is:

data C1 = C1
data C2 = C2
data C3 = C3
...
data C62 = C62
data C63 = C63

data Large a where
  L1 :: Large C1
  L2 :: Large C2
  L3 :: Large C3
  ...
  L62 :: Large C62
  L63 :: Large C63

deriveArgDict ''Large

Gives this error:

    • Constraint tuple arity too large: 63 (max arity = 62)
        Instead, use a nested tuple
    • In the type ‘(c_a3rNa C1, c_a3rNa C2, c_a3rNa C3, c_a3rNa C4,
                    c_a3rNa C5, c_a3rNa C6, c_a3rNa C7, c_a3rNa C8, c_a3rNa C9,
                    c_a3rNa C10, c_a3rNa C11, c_a3rNa C12, c_a3rNa C13, c_a3rNa C14,
                    c_a3rNa C15, c_a3rNa C16, c_a3rNa C17, c_a3rNa C18, c_a3rNa C19,
                    c_a3rNa C20, c_a3rNa C21, c_a3rNa C22, c_a3rNa C23, c_a3rNa C24,
                    c_a3rNa C25, c_a3rNa C26, c_a3rNa C27, c_a3rNa C28, c_a3rNa C29,
                    c_a3rNa C30, c_a3rNa C31, c_a3rNa C32, c_a3rNa C33, c_a3rNa C34,
                    c_a3rNa C35, c_a3rNa C36, c_a3rNa C37, c_a3rNa C38, c_a3rNa C39,
                    c_a3rNa C40, c_a3rNa C41, c_a3rNa C42, c_a3rNa C43, c_a3rNa C44,
                    c_a3rNa C45, c_a3rNa C46, c_a3rNa C47, c_a3rNa C48, c_a3rNa C49,
                    c_a3rNa C50, c_a3rNa C51, c_a3rNa C52, c_a3rNa C53, c_a3rNa C54,
                    c_a3rNa C55, c_a3rNa C56, c_a3rNa C57, c_a3rNa C58, c_a3rNa C59,
                    c_a3rNa C60, c_a3rNa C61, c_a3rNa C62, c_a3rNa C63)’
      In the type instance declaration for ‘Dep.ConstraintsFor’
      In the instance declaration for ‘Dep.ArgDict c_a3rNa Large’
     |
     | Dep.deriveArgDict ''Large
     | ^^^^^^^^^^^^^^^^^^^^^^^^^