Skip to content

Can't witness transitivity ((.)) of isomorphism of Constraints

This compiles,

{-# Language QuantifiedConstraints, GADTs, ConstraintKinds, TypeOperators, FlexibleInstances, MultiParamTypeClasses, UndecidableInstances #-}

data Dict c where
  Dict :: c => Dict c

class    (a => b) => Implies a b
instance (a => b) => Implies a b

type a -:- b = Dict (Implies a b, Implies b a) -- isomorphism of constraints, should be an equivalence relation

id_ :: a-:-a
id_ = Dict

sym_ :: a-:-b -> b-:-a
sym_ Dict = Dict

-- comp_ :: a-:-b -> b-:-c -> a-:-c
-- comp_ Dict Dict = Dict

but uncommenting comp_ and GHC doesn't know how to deduce b (the location message is weird)

$ ghci -ignore-dot-ghci hs/206-bug-quantified-constraints.hs
GHCi, version 8.5.20180128: http://www.haskell.org/ghc/  :? for help
[1 of 1] Compiling Main             ( hs/206-bug-quantified-constraints.hs, interpreted )

hs/206-bug-quantified-constraints.hs:1:1: error:
    Could not deduce: b
    from the context: (Implies a b, Implies b a)
      bound by a pattern with constructor:
                 Dict :: forall (c :: Constraint). c => Dict c,
               in an equation for ‘comp_’
      at hs/206-bug-quantified-constraints.hs:18:7-10
    or from: (Implies b c, Implies c b)
      bound by a pattern with constructor:
                 Dict :: forall (c :: Constraint). c => Dict c,
               in an equation for ‘comp_’
      at hs/206-bug-quantified-constraints.hs:18:12-15
    or from: c
      bound by a quantified context
      at hs/206-bug-quantified-constraints.hs:1:1
  |
1 | {-# Language QuantifiedConstraints, GADTs, ConstraintKinds, TypeOperators, FlexibleInstances, MultiParamTypeClasses, UndecidableInstances #-}
  | ^

hs/206-bug-quantified-constraints.hs:1:1: error:
    Could not deduce: b
    from the context: (Implies a b, Implies b a)
      bound by a pattern with constructor:
                 Dict :: forall (c :: Constraint). c => Dict c,
               in an equation for ‘comp_’
      at hs/206-bug-quantified-constraints.hs:18:7-10
    or from: (Implies b c, Implies c b)
      bound by a pattern with constructor:
                 Dict :: forall (c :: Constraint). c => Dict c,
               in an equation for ‘comp_’
      at hs/206-bug-quantified-constraints.hs:18:12-15
    or from: a
      bound by a quantified context
      at hs/206-bug-quantified-constraints.hs:1:1
  |
1 | {-# Language QuantifiedConstraints, GADTs, ConstraintKinds, TypeOperators, FlexibleInstances, MultiParamTypeClasses, UndecidableInstances #-}
  | ^
Failed, no modules loaded.
Prelude> 

simplifying and uncurrying we get a more minimal example

{-# Language QuantifiedConstraints, GADTs, ConstraintKinds, TypeOperators, FlexibleInstances, MultiParamTypeClasses, UndecidableInstances #-}

data Dict c where
  Dict :: c => Dict c

f :: (a => b, b => a, b => c, c => b, a => c, c) => Dict a
f = Dict

giving a different and longer error message

GHCi, version 8.5.20180128: http://www.haskell.org/ghc/  :? for help
[1 of 1] Compiling Main             ( 206-bug-quantified-constraints.hs, interpreted )

206-bug-quantified-constraints.hs:6:6: error:
    • Could not deduce: c0
      from the context: (a => b, b => a, b => c, c => b, a => c, c)
        bound by the type signature for:
                   f :: forall (a :: Constraint) (b :: Constraint) (c :: Constraint).
                        (a => b, b => a, b => c, c => b, a => c, c) =>
                        Dict a
        at 206-bug-quantified-constraints.hs:6:6-58
    • In the ambiguity check for ‘f’
      To defer the ambiguity check to use sites, enable AllowAmbiguousTypes
      In the type signature:
        f :: (a => b, b => a, b => c, c => b, a => c, c) => Dict a
  |
6 | f :: (a => b, b => a, b => c, c => b, a => c, c) => Dict a
  |      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

206-bug-quantified-constraints.hs:6:6: error:
    • Could not deduce: (b, c0)
      from the context: (a => b, b => a, b => c, c => b, a => c, c)
        bound by the type signature for:
                   f :: forall (a :: Constraint) (b :: Constraint) (c :: Constraint).
                        (a => b, b => a, b => c, c => b, a => c, c) =>
                        Dict a
        at 206-bug-quantified-constraints.hs:6:6-58
      or from: a
        bound by a quantified context
        at 206-bug-quantified-constraints.hs:6:6-58
    • In the type signature:
        f :: (a => b, b => a, b => c, c => b, a => c, c) => Dict a
  |
6 | f :: (a => b, b => a, b => c, c => b, a => c, c) => Dict a
  |      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

206-bug-quantified-constraints.hs:6:6: error:
    • Could not deduce: b0
      from the context: (a => b, b => a, b => c, c => b, a => c, c)
        bound by the type signature for:
                   f :: forall (a :: Constraint) (b :: Constraint) (c :: Constraint).
                        (a => b, b => a, b => c, c => b, a => c, c) =>
                        Dict a
        at 206-bug-quantified-constraints.hs:6:6-58
      or from: c0
        bound by a quantified context
        at 206-bug-quantified-constraints.hs:6:6-58
    • In the ambiguity check for ‘f’
      To defer the ambiguity check to use sites, enable AllowAmbiguousTypes
      In the type signature:
        f :: (a => b, b => a, b => c, c => b, a => c, c) => Dict a
  |
6 | f :: (a => b, b => a, b => c, c => b, a => c, c) => Dict a
  |      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

206-bug-quantified-constraints.hs:6:6: error:
    • Could not deduce: c0
      from the context: (a => b, b => a, b => c, c => b, a => c, c)
        bound by the type signature for:
                   f :: forall (a :: Constraint) (b :: Constraint) (c :: Constraint).
                        (a => b, b => a, b => c, c => b, a => c, c) =>
                        Dict a
        at 206-bug-quantified-constraints.hs:6:6-58
      or from: b0
        bound by a quantified context
        at 206-bug-quantified-constraints.hs:6:6-58
    • In the ambiguity check for ‘f’
      To defer the ambiguity check to use sites, enable AllowAmbiguousTypes
      In the type signature:
        f :: (a => b, b => a, b => c, c => b, a => c, c) => Dict a
  |
6 | f :: (a => b, b => a, b => c, c => b, a => c, c) => Dict a
  |      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

206-bug-quantified-constraints.hs:6:6: error:
    • Could not deduce: b
      from the context: (a => b, b => a, b => c, c => b, a => c, c)
        bound by the type signature for:
                   f :: forall (a :: Constraint) (b :: Constraint) (c :: Constraint).
                        (a => b, b => a, b => c, c => b, a => c, c) =>
                        Dict a
        at 206-bug-quantified-constraints.hs:6:6-58
      or from: b0
        bound by a quantified context
        at 206-bug-quantified-constraints.hs:6:6-58
    • In the ambiguity check for ‘f’
      To defer the ambiguity check to use sites, enable AllowAmbiguousTypes
      In the type signature:
        f :: (a => b, b => a, b => c, c => b, a => c, c) => Dict a
  |
6 | f :: (a => b, b => a, b => c, c => b, a => c, c) => Dict a
  |      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

206-bug-quantified-constraints.hs:6:6: error:
    • Could not deduce: (b, b0)
      from the context: (a => b, b => a, b => c, c => b, a => c, c)
        bound by the type signature for:
                   f :: forall (a :: Constraint) (b :: Constraint) (c :: Constraint).
                        (a => b, b => a, b => c, c => b, a => c, c) =>
                        Dict a
        at 206-bug-quantified-constraints.hs:6:6-58
      or from: a
        bound by a quantified context
        at 206-bug-quantified-constraints.hs:6:6-58
    • In the type signature:
        f :: (a => b, b => a, b => c, c => b, a => c, c) => Dict a
  |
6 | f :: (a => b, b => a, b => c, c => b, a => c, c) => Dict a
  |      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Failed, no modules loaded.
Prelude> 
Trac metadata
Trac field Value
Version 8.5
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