Skip to content

QuantifiedConstraints: lack of inference really is a problem

I've been debugging an issue that boils down to: quantified constraints are completely ignored during type inference.

For example, in this program:

{-# language QuantifiedConstraints #-}
module QC where

data A f = A (f Int)

eqA :: forall f. (forall x. Eq x => Eq (f x)) => A f -> A f -> Bool
eqA (A a) (A b) = a == b

eqA' :: (forall x. Eq x => Eq (f x)) => A f -> A f -> Bool
eqA' = let g = eqA in g

eqA' won't compile because g gets generalised to forall f. A f -> A f -> Bool.

I know this has been discussed (and dismissed) in tickets such as #2256 (closed) and #14942 (closed), but I really think it's a problem.

In my example, I can get the code compiling by turning on ScopedTypeVariables and giving g an annotation. But I don't always have this liberty. For example, in the deriving-compat library there's Template Haskell that generates definitions containing lets, and when a quantified constraint is present these splices don't type check for the same reason eqA' doesn't. The solution here involves a pull request to deriving-compat that uses ScopedTypeVariables to annotate the problematic lets.

But I really think that none of this should be necessary. The reference implementation of QCs (https://github.com/gkaracha/quantcs-impl) doesn't seem to have this problem. Is there anything I'm missing?

Trac metadata
Trac field Value
Version 8.6.2
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information