[GHC] #11753: Type hole(?) causes compiler failure

GHC ghc-devs at haskell.org
Fri Mar 25 08:27:20 UTC 2016


#11753: Type hole(?) causes compiler failure
-------------------------------------+-------------------------------------
           Reporter:  akfp           |             Owner:
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  7.10.3
           Keywords:                 |  Operating System:  Linux
       Architecture:  x86_64         |   Type of failure:  Compile-time
  (amd64)                            |  crash
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 I tried to understand soem Servant code, and added

 {{{#!hs
       bodyCheck :: _
 }}}

 To the following code

 {{{#!hs
 -# LANGUAGE DataKinds #-}
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE TypeOperators #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE TypeSynonymInstances #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 module Servant.Files ( FilesTmp
                      , FilesMem
                      , MultiPartData
                      , MultiPartDataT
                      , Tmp
                      , Mem
                      ) where

 import Control.Monad.Trans.Resource
 import Data.ByteString.Lazy (ByteString)
 import Network.Wai.Parse
 import Servant
 import Servant.Server.Internal

 -- Backends for file upload: in memory or in /tmp ?

 data Mem
 data Tmp

 class KnownBackend b where
   type Storage b :: *

   withBackend :: Proxy b -> (BackEnd (Storage b) -> IO r) -> IO r

 instance KnownBackend Mem where
   type Storage Mem = ByteString

   withBackend Proxy f = f lbsBackEnd

 instance KnownBackend Tmp where
   type Storage Tmp = FilePath


   withBackend Proxy f = runResourceT . withInternalState $ \s ->
     f (tempFileBackEnd s)

 -- * Files combinator, to get all of the uploaded files

 data Files b

 type MultiPartData b = ([Param], [File (Storage b)])
 type MultiPartDataT b = ((MultiPartData b -> IO (MultiPartData b)) -> IO
 (MultiPartData b))

 type FilesMem = Files Mem
 type FilesTmp = Files Tmp

 instance (KnownBackend b,
           HasServer sublayout config) => HasServer (Files b :> sublayout)
 config where
   type ServerT (Files b :> sublayout) m =
     MultiPartDataT b -> ServerT sublayout m

   route Proxy config subserver = WithRequest $ \request ->
     route (Proxy :: Proxy sublayout) config (addBodyCheck subserver
 (bodyCheck request))
     where
       bodyCheck :: _
       bodyCheck request = return $ Route (\f ->
         withBackend (Proxy :: Proxy b) $ \pb -> parseRequestBody pb
 request >>= f
         )
 }}}

 Output:
 {{{
 > :load src/Servant/Test.hs
 [1 of 1] Compiling Servant.Files    ( src/Servant/Test.hs, interpreted )

 src/Servant/Test.hs:59:59:
     Couldn't match type ‘r’ with ‘([Param], [File (Storage b)])’
       because type variable ‘b’ would escape its scope
     This (rigid, skolem) type variable is bound by
       the instance declaration
       at src/Servant/Test.hs:(53,10)-(54,80)
     Expected type: Delayed
                      (((([Param], [File (Storage b)]) -> IO r) -> IO r)
                       -> Server sublayout)
       Actual type: Delayed (Server (Files b :> sublayout))
     Relevant bindings include
       bodyCheck :: Network.Wai.Internal.Request
                    -> m (RouteResult
                            ((([Param], [File (Storage b)]) -> IO r) -> IO
 r))
         (bound at src/Servant/Test.hs:62:7)
       subserver :: Delayed (Server (Files b :> sublayout))
         (bound at src/Servant/Test.hs:58:22)
       route :: Proxy (Files b :> sublayout)
                -> Context config
                -> Delayed (Server (Files b :> sublayout))
                -> Router
         (bound at src/Servant/Test.hs:58:3)
     In the first argument of ‘addBodyCheck’, namely ‘subserver’
     In the third argument of ‘route’, namely
       ‘(addBodyCheck subserver (bodyCheck request))’

 src/Servant/Test.hs:59:70:
     Couldn't match type ‘m’ with ‘IO’
       ‘m’ is untouchable
         inside the constraints (KnownBackend b, HasServer sublayout
 config)
         bound by the instance declaration
         at src/Servant/Test.hs:(53,10)-(54,80)ghc: panic! (the
 'impossible' happened)
   (GHC version 7.10.3 for x86_64-unknown-linux):
         No skolem info: m_a5An[sk]

 Please report this as a GHC bug:  http://www.haskell.org/ghc/reportabug
 }}}

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


More information about the ghc-tickets mailing list