인수 처리는 별도의 기능으로 분리해야합니다. 그 이상으로 일반화하기가 어렵습니다. 인수를 다루는 방법이 매우 다양하기 때문입니다. 다음은 고려 가치가 어떤 종류의 서명은 다음과 같습니다 구현의
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를 배우는 것보다 자신의 롤을 만드는 것이 더 쉬운 경우 중 하나입니다 (더 재미있을 것입니다).