[GHC] #14763: GHC 8.4.1-alpha regression with FunctionalDependencies

GHC ghc-devs at haskell.org
Mon Feb 5 19:57:20 UTC 2018


#14763: GHC 8.4.1-alpha regression with FunctionalDependencies
-------------------------------------+-------------------------------------
        Reporter:  RyanGlScott       |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  highest           |            Milestone:  8.4.1
       Component:  Compiler (Type    |              Version:  8.4.1-alpha3
  checker)                           |
      Resolution:                    |             Keywords:  FunDeps
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  GHC rejects       |  Unknown/Multiple
  valid program                      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Description changed by RyanGlScott:

Old description:

> This regression prevents `esqeueleto-2.5.3` from building with GHC 8.4.1.
> Here is a minimized example of the problem:
>
> {{{#!hs
> {-# LANGUAGE FunctionalDependencies #-}
> {-# LANGUAGE GADTs #-}
> {-# LANGUAGE KindSignatures #-}
> {-# LANGUAGE MultiParamTypeClasses #-}
> module Bug where
>
> data Value a = Value a
>
> data SomeValue expr where
>   SomeValue :: Esqueleto query expr backend => expr (Value a) ->
> SomeValue expr
>
> class Esqueleto (query :: * -> *) (expr :: * -> *) backend
>         | query -> expr backend, expr -> query backend
>
> data SqlQuery a
>
> data SqlBackend
>
> data SqlExpr a where
>   ECompositeKey :: SqlExpr (Value a)
>
> instance Esqueleto SqlQuery SqlExpr SqlBackend
>
> match' :: SomeValue SqlExpr -> a
> match' (SomeValue ECompositeKey) = undefined
> }}}
>
> On GHC 8.2.2, this typechecks without issue. On GHC 8.4.1-alpha (version
> 8.4.0.20180204), this fails with:
>
> {{{
> $ /opt/ghc/8.4.1/bin/ghci Bug.hs
> GHCi, version 8.4.0.20180204: http://www.haskell.org/ghc/  :? for help
> Loaded GHCi configuration from /home/rgscott/.ghci
> [1 of 1] Compiling Bug              ( Bug.hs, interpreted )
>
> Bug.hs:25:19: error:
>     • Could not deduce: query ~ SqlQuery
>         arising from a functional dependency between:
>           constraint ‘Esqueleto query SqlExpr backend’
>             arising from a pattern with constructor:
>                            SomeValue :: forall (query :: * -> *) (expr ::
> * -> *) backend a.
>                                         Esqueleto query expr backend =>
>                                         expr (Value a) -> SomeValue expr,
>                          in an equation for ‘match'’
>           instance ‘Esqueleto SqlQuery SqlExpr SqlBackend’ at
> Bug.hs:22:10-46
>       from the context: Value a1 ~ Value a2
>         bound by a pattern with constructor:
>                    ECompositeKey :: forall a. SqlExpr (Value a),
>                  in an equation for ‘match'’
>         at Bug.hs:25:19-31
>       ‘query’ is a rigid type variable bound by
>         a pattern with constructor:
>           SomeValue :: forall (query :: * -> *) (expr :: * -> *) backend
> a.
>                        Esqueleto query expr backend =>
>                        expr (Value a) -> SomeValue expr,
>         in an equation for ‘match'’
>         at Bug.hs:25:9-31
>       Inaccessible code in
>         a pattern with constructor:
>           ECompositeKey :: forall a. SqlExpr (Value a),
>         in an equation for ‘match'’
>     • In the pattern: ECompositeKey
>       In the pattern: SomeValue ECompositeKey
>       In an equation for ‘match'’:
>           match' (SomeValue ECompositeKey) = undefined
>    |
> 25 | match' (SomeValue ECompositeKey) = undefined
>    |                   ^^^^^^^^^^^^^
> }}}

New description:

 This regression prevents `esqueleto-2.5.3` from building with GHC 8.4.1.
 Here is a minimized example of the problem:

 {{{#!hs
 {-# LANGUAGE FunctionalDependencies #-}
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE KindSignatures #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 module Bug where

 data Value a = Value a

 data SomeValue expr where
   SomeValue :: Esqueleto query expr backend => expr (Value a) -> SomeValue
 expr

 class Esqueleto (query :: * -> *) (expr :: * -> *) backend
         | query -> expr backend, expr -> query backend

 data SqlQuery a

 data SqlBackend

 data SqlExpr a where
   ECompositeKey :: SqlExpr (Value a)

 instance Esqueleto SqlQuery SqlExpr SqlBackend

 match' :: SomeValue SqlExpr -> a
 match' (SomeValue ECompositeKey) = undefined
 }}}

 On GHC 8.2.2, this typechecks without issue. On GHC 8.4.1-alpha (version
 8.4.0.20180204), this fails with:

 {{{
 $ /opt/ghc/8.4.1/bin/ghci Bug.hs
 GHCi, version 8.4.0.20180204: http://www.haskell.org/ghc/  :? for help
 Loaded GHCi configuration from /home/rgscott/.ghci
 [1 of 1] Compiling Bug              ( Bug.hs, interpreted )

 Bug.hs:25:19: error:
     • Could not deduce: query ~ SqlQuery
         arising from a functional dependency between:
           constraint ‘Esqueleto query SqlExpr backend’
             arising from a pattern with constructor:
                            SomeValue :: forall (query :: * -> *) (expr ::
 * -> *) backend a.
                                         Esqueleto query expr backend =>
                                         expr (Value a) -> SomeValue expr,
                          in an equation for ‘match'’
           instance ‘Esqueleto SqlQuery SqlExpr SqlBackend’ at
 Bug.hs:22:10-46
       from the context: Value a1 ~ Value a2
         bound by a pattern with constructor:
                    ECompositeKey :: forall a. SqlExpr (Value a),
                  in an equation for ‘match'’
         at Bug.hs:25:19-31
       ‘query’ is a rigid type variable bound by
         a pattern with constructor:
           SomeValue :: forall (query :: * -> *) (expr :: * -> *) backend
 a.
                        Esqueleto query expr backend =>
                        expr (Value a) -> SomeValue expr,
         in an equation for ‘match'’
         at Bug.hs:25:9-31
       Inaccessible code in
         a pattern with constructor:
           ECompositeKey :: forall a. SqlExpr (Value a),
         in an equation for ‘match'’
     • In the pattern: ECompositeKey
       In the pattern: SomeValue ECompositeKey
       In an equation for ‘match'’:
           match' (SomeValue ECompositeKey) = undefined
    |
 25 | match' (SomeValue ECompositeKey) = undefined
    |                   ^^^^^^^^^^^^^
 }}}

--

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


More information about the ghc-tickets mailing list