[Haskell] main::[String]->IO() ?

Malcolm Wallace Malcolm.Wallace at cs.york.ac.uk
Tue Mar 23 17:32:49 EST 2004

David Sankel <camio at yahoo.com> writes:

> Since type signature declarations for functions are generally considered
> good practice, those who use "<- getArgs" would actually need to type two
> extra characters.  And those who do not use getArgs typically (which may or
> may not be the case in general), would type an extra 14 characters.

Well, that is to ignore the possibility that if 'main' has arguments,
you can pattern-match directly on them, rather than using a more
verbose 'case' expression as is currently widely practiced after

However, as has already been mentioned, there is nothing to stop the
original poster defining a library wrapper such as

    withArgs :: ([String]->IO ()) -> IO ()
    withArgs = (>>=) getArgs

and then the "boilerplate" is simply

    main = withArgs main'

    main' []     = ...
    main' (x:xs) = ...

> One might also consider getProgName and getEnv to be plausible arguments to
> main as they are for some variants of c.  However, in this case we are
> getting quite excessive with main's arguments.

Again, some simple wrappers will do the job nicely.

    withProgArgsEnv :: (String -> [String] -> [(String,String)] -> IO ())
                       -> IO ()
    withProgArgsEnv main = do p <- getProgName
                              a <- getArgs
                              e <- getEnvironment	-- not standard
                              main p a e

Maybe a small set of such wrappers could be added to the hierarchical
libraries, if someone wants to do a little design.


More information about the Haskell mailing list