2017-11-11 16 views
2

나는 함수명 parseArgs을 쓰고있다. 이것은 명령 행 인자를리스트 형태로 취할 것이다. 목록의 크기가 2 인 경우 함수는 목록의 내용을 구문 분석하여 튜플로 변환하고, 그렇지 않으면 Nothing을 반환합니다. 나는 이것에 대해 어떻게해야하는지 확실히 알지 못한다. 내 코드는 지금까지 다음과 같습니다 :하스켈 튜플리스트

코드에서
parseArgs :: [String] -> Maybe (String, Maybe String) 
parseArgs [x, y] 
    | length [x, y] < 2 = Nothing 
    | length [x, y] > 2 = Nothing 
    | otherwise = Just (x, Just y) 

답변

7

, parseArgs [x, y] 그것은 단지 정확히 두 요소의 목록을 받아 의미한다. 따라서 length [x, y]은 항상 2이고 해당 조건 (> 2) (< 2)은 결코 충족되지 않습니다.

otherwise은 항상 두 가지 요소의 목록입니다. 따라서 입력이 두 요소의 목록 일 때, x와 y를 얻을 수 있고 그것들을 확실히 튜플로 만들 수 있습니다.

그러나 그 외의 경우 parseArgs []parseArgs ["a"]parseArgs ["a","b","c"] 인 경우 "함수 parseArgs의 비 포괄적 패턴"예외가 발생합니다. 코드가 모든 패턴을 포함하지 않았기 때문입니다 [String]

여기에 출력하기 위해 Maybe (String, String)를 사용합니다. 이것은 parseArg가 Just (String, String) 또는 Nothing을 생성 함을 의미합니다. 아마도 그것은 당신이 원하는 것에 더 가깝습니다.

그래서이 시도 : Y : 입력 [문자열] × 될 일 경우 의미

parseArgs :: [String] -> Maybe (String, String) 
parseArgs x:y:[] = Just (x,y) 
parseArgs xs = Nothing 

[(정확한 개의 문자열리스트) 단 (X, Y)를 생성한다. 그 외에는 아무것도 생산하지 마십시오. 이 방법으로 [String]의 모든 패턴을 다룹니다. 두 요소 목록이 아닌 경우 Nothing을 얻을 수 있습니다.

편집 : 두 번째로 @ pdoherty926의 parseArgs _ = Nothing은 와일드 카드 _는 "그 외 모든 것"을 표현하는 더 좋은 방법입니다.

5

@Johhny 리아 그것에 나를 이길하지만 여기 내 비슷한 대답 : 당신의 요구 사항에 따라

, 나는 두 번째 튜플 요소가 Maybe String 될 이유에 불분명 해요는. 따라서 함수의 유형이 다음과 같은 것처럼 계속 진행할 것입니다. parseArgs :: [String] -> Maybe (String, String)

parseArgs :: [String] -> Maybe (String, String) 
parseArgs [x, xx] = Just (x, xx) -- pattern match on the list of two elements 
parseArgs _ = Nothing    -- discard _everything_ else 

print $ parseArgs ["hi", "bye"] -- Just ("hi", "bye") 
print $ parseArgs ["hi"]    -- Nothing