
#13884: To an automatic compilation of file-header LANGUAGE pragmas in GHC. -------------------------------------+------------------------------------- Reporter: vanto | Owner: (none) Type: feature request | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.0.2 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: Other | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by vanto): Replying to bgamari\\
I suspect that making the compiler's behavior conditional on these heuristics would at best result in some very confusing error messages.\\ Maybe or maybe not. GHC messages should not be underestimated. Here he answered well.\\ Take a look at this other example.\\
{{{ module Testfoo2 where import Data.Kind data Foo (a :: Type) (b :: Type) where MkFoo :: (a ~ Int, b ~ Char) => Foo a b }}} GHC responds\\ {{{ Prelude> :l testfoo2 [1 of 1] Compiling Testfoo2 ( testfoo2.hs, interpreted ) testfoo2.hs:10:16: error: Illegal kind signature: `Type' Perhaps you intended to use KindSignatures In the data type declaration for `Foo' testfoo2.hs:10:28: error: Illegal kind signature: `Type' Perhaps you intended to use KindSignatures In the data type declaration for `Foo' Failed, modules loaded: none. Prelude> :r [1 of 1] Compiling Testfoo2 ( testfoo2.hs, interpreted ) testfoo2.hs:11:1: error: * Illegal generalised algebraic data declaration for `Foo' (Use GADTs to allow GADTs) * In the data declaration for `Foo' Failed, modules loaded: none. Prelude> :r [1 of 1] Compiling Testfoo2 ( testfoo2.hs, interpreted ) Ok, modules loaded: Testfoo2. }}} If the second function is added {{{ data family Song (a :: k) }}} and that we start again, GHC respond:\\ {{{ *Testfoo2> :l testfoo2 [1 of 1] Compiling Testfoo2 ( testfoo2.hs, interpreted ) testfoo2.hs:13:16: error: Illegal kind signature: `Type' Perhaps you intended to use KindSignatures In the data type declaration for `Foo' testfoo2.hs:13:28: error: Illegal kind signature: `Type' Perhaps you intended to use KindSignatures In the data type declaration for `Foo' testfoo2.hs:16:1: error: Unexpected kind variable `k' Perhaps you intended to use PolyKinds In the declaration for type family `Song' testfoo2.hs:16:24: error: Illegal kind signature: `k' Perhaps you intended to use KindSignatures In the declaration for type family `Song' Failed, modules loaded: none. Prelude> :r [1 of 1] Compiling Testfoo2 ( testfoo2.hs, interpreted ) testfoo2.hs:16:1: error: Unexpected kind variable `k' Perhaps you intended to use PolyKinds In the declaration for type family `Song' Failed, modules loaded: none. Prelude> :r [1 of 1] Compiling Testfoo2 ( testfoo2.hs, interpreted ) testfoo2.hs:13:1: error: * Illegal generalised algebraic data declaration for `Foo' (Use GADTs to allow GADTs) * In the data declaration for `Foo' Failed, modules loaded: none. Prelude> :r [1 of 1] Compiling Testfoo2 ( testfoo2.hs, interpreted ) testfoo2.hs:16:1: error: * Illegal family declaration for `Song' Use TypeFamilies to allow indexed type families * In the data family declaration for `Song' Failed, modules loaded: none. Prelude> :r [1 of 1] Compiling Testfoo2 ( testfoo2.hs, interpreted ) Ok, modules loaded: Testfoo2. *Testfoo2> :r [1 of 1] Compiling Testfoo2 ( testfoo2.hs, interpreted ) Ok, modules loaded: Testfoo2. }}} If you look closer you can even remove the pragma {{{ {- # LANGUAGE KindSignatures # -} }}} And the program still compiles well. And GHC did it all alone without my help.\\ I think that has the merit of being studied. You have to be enthusiastic about doing that. Maybe in twenty years someone will code that? They will be compilers worthy of the twenty-first century. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/13884#comment:3 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler