invoking a Haskell script without a .hs extension

Philip Weaver philip.weaver at
Mon Aug 18 00:32:01 EDT 2008

On Sun, Aug 17, 2008 at 8:45 PM, Paul Jarc <prj at> wrote:

> I have a Haskell script called "notify", without a .hs extension,
> which causes some problems.  (I'm using ghc 6.8.3.)
> First attempt: runhaskell notify
> Without the .hs extension, ghc doesn't know it's a Haskell script, and
> so I get "Could not find module `notify'".  Maybe runhaskell should
> automatically add "-x hs" to the ghc command?
> Second attempt: runhaskell -x hs notify
> This get me "Not in scope: `main'".  runhaskell is invoking ghc with
> these arguments:
>  -ignore-dot-ghci -x -e ':set prog "hs"' -e ':main ["notify"]' hs
> So it looks like runhaskell it treating "-x" as an argument to be
> relayed to ghc, "hs" as the name of the script, and "notify" as an
> argument to the script.  I guess I need to use "--" to make it clear
> where the ghc arguments end and where the script and its arguments
> begin.
> Third attempt: runhaskell -- -x hs -- notify
> This gets me "Not in scope: `main'" again.  runhaskell is invoking ghc
> with these arguments:
>  -ignore-dot-ghci -x -e ':set prog "hs"' -e ':main ["--","notify"]' hs
> This looks like a bug in the "--" handling, unless I'm misinterpreting
> the usage message I get from running plain "runhaskell".
> Fourth attempt: ghc -ignore-dot-ghci -e ':set prog "notify"' \
>  -e ':main []' -x hs notify
> This works, but passing arguments becomes rather cumbersome.  If
> there's a way to get runhaskell to pass "-x hs" in the right place,
> that would be much better.
> A somewhat related issue: I'd like to avoid hard-coding the path to
> runhaskell or ghc in the #! line.  Instead, I'd like to use #!/bin/sh,
> and have the shell find runhaskell or ghc in $PATH.

I'll let someone more knowledgeable address the other issues, but as for the
argument to #!, I believe you could/should use "#!/usr/bin/env runhaskell".

> This means the
> first few lines of the script would have to be executed by sh, but
> ignored by ghc.  Most scripting langauges have some way of doing this,
> although it's often by accident.  The best way I've seen is in Guile,
> where "#!" starts a multi-line comment, and "!#" ends it.  For
> Haskell, this is the best I could come up with:
> #!/bin/sh
> {- > /dev/null 2>&1
> exec ghc -ignore-dot-ghci \
>  -e ":set prog \"$0\"" \
>  -e ':main []' -x hs "$0"
> -}
> But this depends on "{-" not existing as an executable command, or at
> least not doing anything harmful when invoked like this.  I'd like to
> avoid depending on anything like that.  Does anyone have any better
> ideas?

> paul
> _______________________________________________
> Glasgow-haskell-users mailing list
> Glasgow-haskell-users at
-------------- next part --------------
An HTML attachment was scrubbed...

More information about the Glasgow-haskell-users mailing list