Ticket #4179 (closed bug: fixed)

Opened 3 years ago

Last modified 3 years ago

Infinite loop with type function inference

Reported by: simonpj Owned by:
Priority: normal Milestone: 7.0.1
Component: Compiler (Type checker) Version: 6.12.3
Keywords: Cc:
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: None/Unknown Difficulty:
Test Case: indexed-types/should_fail/T4179 Blocked By:
Blocking: Related Tickets:

Description

Kevin Quick (quick@…) writes: I started with the following:

{-# LANGUAGE TypeFamilies  #-}

class DoC a where
     type A2 a
     op :: a -> A2 a

data Con x = InCon (x (Con x))
type FCon x = x (Con x)

foldDoC :: Functor f => (f a -> a) -> Con f -> a foldDoC f (InCon t) = f (fmap (foldDoC f) t)

doCon :: (DoC (FCon x)) => Con x -> A2 (FCon x) doCon (InCon x) = op x

fCon :: (Functor x, DoC (FCon x)) => Con x -> A2 (FCon x) fCon = foldDoC op

I then changed the rank of op, but forgot to update the foldDoC accordingly---see below. Attempting to compile this causes GHC to run forever using 100% cpu. The corrected definition of foldDoC works fine. Should the GHC (6.12.1) behavior in the face of my foolishness be reported as a bug or is this a legitimate infinite recursion of type deduction?

{-# LANGUAGE TypeFamilies  #-}

class DoC a where
     type A2 a
     type A3 a
     op :: a -> A2 a -> A3 a

data Con x = InCon (x (Con x))
type FCon x = x (Con x)

-- should have been changed to this, which works
-- foldDoC :: Functor f => (f a -> a) -> A2 (FCon f) -> Con f -> a
-- foldDoC f i (InCon t) = f (fmap (foldDoC f i) t)

-- this original version causes GHC to hang foldDoC :: Functor f => (f a -> a) -> Con f -> a foldDoC f (InCon t) = f (fmap (foldDoC f) t)

doCon :: (DoC (FCon x)) => Con x -> A2 (FCon x) -> A3 (FCon x) doCon (InCon x) = op x

-- note that if this is commented out then there's no hang: presumably because GHC doesn't have to perform type deduction for foldDoC.
fCon :: (Functor x, DoC (FCon x)) => Con x -> A2 (FCon x) -> A3 (FCon x) fCon = foldDoC op

Change History

Changed 3 years ago by igloo

  • component changed from Compiler to Compiler (Type checker)
  • blockedby 4232 added
  • milestone set to 6.14.1

Changed 3 years ago by igloo

  • blockedby 4232 removed

Changed 3 years ago by simonpj

  • status changed from new to closed
  • testcase set to indexed-types/should_fail/T4179
  • resolution set to fixed

Happily this works with the new typechecker.

Simon

Note: See TracTickets for help on using tickets.