2017-04-23 2 views
4

저는 haskell에서 명령 줄 인수를 구문 분석하려고합니다.명령 줄 인수를 구문 분석합니다.

import System.Environment 

work :: [Integer] -> Int 
work (s:r:t:es) = length es 

main :: IO() 
main = getArgs >>= putStrLn . show . work . (map read) 

내가 그것을 실행 :

./test 2 10 10 [7, 3, 5, 4, 4] 

예상처럼 출력이 5 아래

은 샘플 코드입니다. 하지만 정수와 합 지능과 길이를 대체 할 경우 실행이

test: Prelude.read: no parse 

누군가가이 작업을 수행하는 방법을 설명 할 수있는 오류가 발생?

답변

6

getArgs에 의해 반환 된 목록은 다음과 같습니다 : ["2", "10", "10", "[7,", "3,", "5,", "4,", "4]"]. 이 문자열의 처음 세 개는 정수의 유효한 문자열 표현이지만 나머지는 유효하지 않습니다. 따라서 read을 사용하면 오류가 발생합니다.

길이를 계산할 때 오류가 표시되지 않는 이유는 length은 목록의 값을 살펴 볼 필요가 없기 때문에 read은 평가되지 않습니다.

그러나 값을 합산하려면 확실히 평가해야합니다. 그래서 당신은 예외를 얻습니다.

문제를 해결하려면 대괄호와 쉼표가 포함되지 않도록 인수의 형식을 변경하거나 수동으로 인수를 살펴본 다음 read으로 전달하기 전에 대괄호와 쉼표를 제거하십시오.

또 다른 방법은 공백으로 구분하여 나중에 인수를 연결 한 다음 ("7, 3, 5, 4, 4"로 끝남) 단일 문자열로 read에 전달하는 것입니다. [Integer]을 입력하십시오.

관련 문제