Manuel, Simon,

I've spotted a hopefully small but for us quite annoying bug in GHC's type checker: it loops when overloading resolving involves a circular constraint graph containing type-family applications.

The following program (also attached) demonstrates the problem:

  {-# LANGUAGE FlexibleContexts #-}
  {-# LANGUAGE TypeFamilies     #-}

  type family F a :: *
  type instance F Int = (Int, ())

  class C a
  instance C ()
  instance (C (F a), C b) => C (a, b)

  f :: C (F a) => a -> Int
  f _ = 2

  main :: IO ()
  main = print (f (3 :: Int))

My guess is that the loop is caused by the constraint C (F Int) that arises from the use of f in main:

  C (F Int) = C (Int, ()) <= C (F Int)

Indeed, overloading can be resolved successfully by "black-holing" the initial constraint, but it seems like the type checker refuses to do so.

Can you confirm my findings?

I'm not sure whether this is a known defect. If it isn't, I'd be more than happy to issue a report.

Since this problem arises in a piece of very mission-critical code, I would be pleased to learn about any workarounds.

Thanks in advance,

  Stefan
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to