#7288: type inference fails with where clause (RankNTypes, TypeFamilies)
---------------------------------------+------------------------------------
 Reporter:  agrafix                    |          Owner:                        
                  
     Type:  bug                        |         Status:  new                   
                  
 Priority:  normal                     |      Component:  Compiler (Type 
checker)                 
  Version:  7.6.1                      |       Keywords:  type inference, 
rankntypes, typefamilies
       Os:  Unknown/Multiple           |   Architecture:  Unknown/Multiple      
                  
  Failure:  GHC rejects valid program  |       Testcase:                        
                  
Blockedby:                             |       Blocking:                        
                  
  Related:                             |  
---------------------------------------+------------------------------------
 when using RankNTypes and TypeFamilies with polymorphic functions, type
 inference works in let but not in where clauses.


 {{{
 {-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE TypeFamilies #-}

 import Control.Monad

 class Monad m => GenM m where
     type GenReq m :: *

 type GenFun a b = forall m. GenM m => a -> m b
 data GenDef a b = GenDef { name :: String, fun :: GenFun a b }
 data Gen a b = Gen
 data Struct = Struct

 mkGen :: forall a b. String -> GenFun a b -> GenDef a b
 mkGen = GenDef

 runGen :: GenM m => Gen a b -> a -> m (Maybe b)
 runGen = undefined

 getPatients :: GenM m => m [Int]
 getPatients = undefined

 -- BROKEN
 myGen :: Gen String Struct -> GenDef Int [Struct]
 myGen structGen =
     mkGen "myGen" $ \pid ->
         do pats <- getPatients
            structs <- mapM patToStruct pats
            return structs
         where
           patToStruct pid =
               do Just struct <- runGen structGen (show pid)
                  return struct

 -- WORKS
 myGen' :: Gen String Struct -> GenDef Int [Struct]
 myGen' structGen =
     mkGen "myGen" $ \pid ->
     do pats <- getPatients
        let patToStruct pid =
                do Just struct <- runGen structGen (show pid)
                   return struct
        structs <- mapM patToStruct pats
        return structs

 -- WORKS
 myGen'' :: Gen String Struct -> GenDef Int [Struct]
 myGen'' structGen =
     mkGen "myGen" $ \pid ->
         do pats <- getPatients
            structs <- mapM patToStruct pats
            return structs
         where
           patToStruct :: GenM m => Int -> m Struct
           patToStruct pid =
               do Just struct <- runGen structGen (show pid)
                  return struct

 }}}

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

_______________________________________________
Glasgow-haskell-bugs mailing list
Glasgow-haskell-bugs@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to