35

Is there a way, either standard, or a clever hack, to make invoking GHC on a file only run the type-checker? E.g.

$ ghc --just-check-the-types x.hs
$

No output files, no .hi or .o, etc. Don't want to/can't use the GHC API. Just talking about the command-line program, here.

Christopher Done
  • 5,886
  • 4
  • 35
  • 38
  • 2
    Why not use the GHC API? This sounds like the sort of thing it's for. – C. A. McCann Sep 11 '12 at 16:11
  • 2
    @C.A.McCann Having it as a dependency increases linking time and executable size by a lot. And I've had a lot of issues with it, see these odd error messages (that don't appear when the executable is called) http://hpaste.org/74600 – Adam Bergmark Sep 11 '12 at 19:50

2 Answers2

43

What about ghc -fno-code file.hs. It will generate no other files and will show errors if your files don't typecheck.

Caveat: this will not do analysis on in-exhaustive pattern matches, so if you want those additional useful warnings, don't use this option alone.

Christopher Done
  • 5,886
  • 4
  • 35
  • 38
Satvik
  • 11,238
  • 1
  • 38
  • 46
  • `-fno-code` still needs a `main`. Is there other way? – daparic Nov 02 '18 at 02:40
  • If a module name is omitted, `Main` is assumed. In other words, if you put whatever module name (e.g. `module Foo where` at the top of the file) it doesn't require a `main`. – Ohashi Jul 15 '19 at 08:55
11

Here's a hack:

crabgrass:~/programming% ghc test.hs -e 'return 0'

test.hs:1:7:
    No instance for (Num (a0 -> t0))
      arising from the literal `3'
    Possible fix: add an instance declaration for (Num (a0 -> t0))
    In the expression: 3
    In the expression: 3 4
    In an equation for `foo': foo = 3 4
zsh: exit 1     ghc test.hs -e 'return 0'
Daniel Wagner
  • 145,880
  • 9
  • 220
  • 380
  • 1
    @Tarrasch Works for me when I use `ghc test.hs -e 'return "test.hs"'`. I think it works because `-e` is expression evaluation mode, which as far as I can tell means that whilst ghc parses and typechecks test.hs, it doesn't need to link it to execute the expression `return "test.hs"`, so doesn't generate .o .hi etc – AndrewC Sep 13 '12 at 00:05
  • I would use `ghc test.hs -e 'return ()'` because it doesn't generate any output. You example will output `0` to stdout. – Aadit M Shah Nov 13 '19 at 07:53