Обработка аргумента должна быть выделена в отдельную функцию.
Помимо этого, трудно обобщать, потому что есть много разных способов обработки аргументов.
Вот несколько типов подписей, которые стоит рассмотреть:
exitIfNonempty :: [Arg] -> IO [Arg] -- return args unless empty
processOptions :: [Arg] -> (OptionRecord, [Arg]) -- convert options to record,
-- return remaining args
processOptionsBySideEffect :: [Arg] -> State [Arg] -- update state from options,
-- return remaining args
callFirstArgAsCommand :: [(Name, [Arg] -> IO ())] -> [Arg] -> IO ()
И пара набросков реализаций (ни один из этого кода не был рядом с компилятором):
exitIfNonempty [] = putStrLen "No arguments; exiting"
exitIfNonempty args = return args
callFirstArgAsCommand commands [] = fail "Missing command name"
callFirstArgAsCommand commands (f:as) =
case lookup f commands in
Just f -> f as
Nothing -> fail (f ++ " is not the name of any command")
Я оставлю остальных на ваше воображение.
В моих же интересах написать функцию, к которой добавляется другой кейс в основной?
Да. Более того, вам следует создать библиотеку комбинаторов , которую можно легко вызывать для обработки аргументов командной строки для различных программ. Такие библиотеки, несомненно, уже существуют в Hackage , но это один из тех случаев, когда вам может быть проще свернуть свой собственный, чем изучать чужой API (и это определенно будет веселее).