ghci scripts ending in printf lines fail with Exception: Prelude.undefined
There appears to be some differences in runhaskell/ghci and ghc when it comes to printf.
Consider this program:
import Text.Printf
import System.Environment
main = do
[who] <- getArgs
printf "hello, %s\n" who
when compiled:
$ ghc A.hs
$ ./A world
hello, world
When run in GHci:
$ ghci A.hs
Prelude Main> :set args world
Prelude Main> main
hello, world
*** Exception: Prelude.undefined
Hmm! And in runhaskell:
$ runhaskell A.hs world
hello, world
*** Exception: Prelude.undefined
An ugly 'return ()' seems to help:
import Text.Printf
import System.Environment
main = do
[who] <- getArgs
printf "hello, %s\n" who
return ()
which produces:
$ runhaskell A.hs world
hello, world
As does an explicit annotation:
$ cat A.hs
import Text.Printf
import System.Environment
main = do
[who] <- getArgs
printf "hello, %s\n" who :: IO ()
So some defaulting is coming into play?
$ ghci
Prelude> :l A.hs
*Main> :t main
main :: IO t
*Main> :set args world
*Main> main :: IO ()
hello, world
*Main> main :: IO String
hello, world
"*** Exception: Prelude.undefined
Is GHCi/runhaskell giving an overly generous type to 'main'? I note the following is also valid "runhaskell" programs:
$ cat A.hs
main = return "hello, world"
$ runhaskell A.hs
"hello, world"
Trac metadata
| Trac field | Value |
|---|---|
| Version | 6.6 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | GHCi |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | Unknown |
| Architecture | Unknown |