2010-05-16 7 views
1

마지막 질문 저녁, 내 하스켈 프로그램의 기본 입력 기능을 짓고 있어요 내가 여러 작업

에서 가져온하는 인수 그래서

을 사용할 수 있는지 확인해야
args <- getArgs 
case length args of 
    0 -> putStrLn "No Arguments, exiting" 
    otherwise -> { other methods here} 

다른 방법을 설정하는 지능적인 방법이 있습니까, 아니면 다른 케이스가 주 내부에 던져지는 기능을 작성하는 것이 가장 좋을까요?

사례에 대한 더 나은 해결책이 있습니다. 나는 단지 하나의 이름을 가져야한다.

답변

2

인수 처리는 별도의 기능으로 분리해야합니다. 그 이상으로 일반화하기가 어렵습니다. 인수를 다루는 방법이 매우 다양하기 때문입니다. 다음은 고려 가치가 어떤 종류의 서명은 다음과 같습니다 구현의

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를 배우는 것보다 자신의 롤을 만드는 것이 더 쉬운 경우 중 하나입니다 (더 재미있을 것입니다).

8
args <- getArgs 
case length args of 
    0 -> putStrLn "No Arguments, exiting" 
    otherwise -> do 
     other 
     methods 
     here 
관련 문제