[GHC] #5759: Infinite recursion while deriving type

GHC cvs-ghc at haskell.org
Tue Jan 10 01:46:52 CET 2012


#5759: Infinite recursion while deriving type
---------------------------------------+------------------------------------
 Reporter:  Bogdan                     |          Owner:                  
     Type:  bug                        |         Status:  new             
 Priority:  normal                     |      Component:  Compiler        
  Version:  7.0.4                      |       Keywords:                  
       Os:  Unknown/Multiple           |   Architecture:  Unknown/Multiple
  Failure:  GHC rejects valid program  |       Testcase:                  
Blockedby:                             |       Blocking:                  
  Related:                             |  
---------------------------------------+------------------------------------
 The following code:
 {{{
 {-# LANGUAGE MultiParamTypeClasses, FlexibleInstances,
 OverlappingInstances,
     UndecidableInstances, FunctionalDependencies #-}

 class Container a b | a -> b where
     make :: b -> a

 data Cont a = Cont a deriving (Show, Eq)

 instance Container (Cont a) a where
     make x = Cont x

 instance (Container a b, Show a, Eq a, Num b) => Num a where
     fromInteger x = make (fromInteger x)

 d = fromInteger 3 :: Cont Integer

 main = do
     print d
 }}}
 produces compilation error:
 {{{
     Context reduction stack overflow; size = 21
     Use -fcontext-stack=N to increase stack size to N
       $dNum :: Num b19
       [skipped]
       $dNum :: Num b0
     In the first argument of `make', namely `(fromInteger x)'
     In the expression: make (fromInteger x)
     In an equation for `fromInteger':
         fromInteger x = make (fromInteger x)
 }}}

 Why I think this should work: my understanding is that in line
 "fromInteger x = make (fromInteger x)" compiler should take into account
 that[[BR]]
 1) the signature for make is "make :: b -> a",[[BR]]
 2) type b is known at the moment of creating instance (because a == Cont
 Integer, which is an instance of Container (Cont Integer) Integer),[[BR]]
 and cast "fromInteger x" to type b and pass it to make. This seems to be
 fixed in 7.2.2 (where this code compiles and displays "Cont 3"), although
 I did not manage to find any related entry in the changelog.

 If one replaces the block "instance (Container a b, ..." with
 {{{
 class NumEquiv a where
     fromInt :: Integer -> a

 instance NumEquiv Integer where
     fromInt = id

 instance (Container a b, NumEquiv b) => NumEquiv a where
     fromInt x = make (fromInt x)
 }}}
 (which is the same as the initial code, the only difference being that the
 target typeclass --- NumEquiv --- is defined locally in the code), the
 code compiles successfully even on 7.0.4.

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/5759>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler



More information about the Glasgow-haskell-bugs mailing list