{-# LANGUAGE DeriveGeneric #-} import GHC.Generics import System.Console.GetOpt.Generics -- All you have to do is to define a type and derive some instances: data Options = Options { port :: Int, daemonize :: Bool, config :: Maybe FilePath } deriving (Show, GHC.Generics.Generic) instance System.Console.GetOpt.Generics.Generic Options instance HasDatatypeInfo Options -- Then you can use `getArguments` to create a command-line argument parser: main :: IO () main = do options <- getArguments print (options :: Options)