If you are just working with IO
avoiding applicatives then I’d say you start with
-- This functions takes the list of arguments and returns something of your interest
-- the list of arguments look like ["--verbose","2","--color", "always", "-f" etc...]
yourOwnSimpleParser :: [String] -> SomeUserDefinedType
yourOwnSimpleParser = undefined
main = do
list_of_arguments <- getArgs
yourOwnSimpleParser list_of_arguments
...
Once you convice yourself writing your own parser is a bad idea, go with optparse-applicative. Despite of its applicative interface, you’ll see it is actaully very easy to use.
Then you should checkout Iris too, which is built on top of optparse-applicative and is a more complete CLI framework, with good documentation. Probably you need a little bit of experience to use it headachelessly (is this even a word?)