2012-04-01 3 views
1

"A12"와 같은 사용자 입력 문자열을 ('A', 12)와 같은 하스켈 튜플에 구문 분석하려고합니다.하스켈에서 사용자 입력을 구문 분석

import Data.Maybe 

type Pos = (Char, Int) 

parse :: String -> Maybe Pos 
parse u = do 
    (c, rest) <- (listToMaybe.reads) u 
    (r, _) <- (listToMaybe.reads) rest 
    return $ (c, r) 

을하지만 항상 반환 값 없음 :

는 여기에 내가 시도거야. 왜 이런 일이 일어나고이 문자열을 파싱하는 올바른 방법은 무엇입니까? 이것은 매우 간단하기 때문에 Parsec이나 유사한 고급 구문 분석 라이브러리를 사용하지 않는 것이 좋습니다.

EDIT (명확히) 샘플 입력 및 출력 :

"A12"Just ('A', 12)

"J5"Just ('J', 5)

"A"Nothing

"2324"Nothing

제공 범 범 범

답변

4

read의 따라서 가치가 무엇인지 확실하지 않다. 즉, 문자에 대한 하스켈 구문은 작은 따옴표를 사용하기 때문에 한 문자에 show 문자를 붙이면 작은 따옴표가 추가되고 작은 따옴표는 작은 따옴표로 간주됩니다. 즉

은 함수 구문 'A' 42 같은 기대하고 있음을하려고하면 실제로는 작동합니다 다음에 대한 reads 당신의 형식

> parse "'A' 42" 
Just ('A',42) 

, 내가 대신 첫 번째 문자에 대한 패턴 매칭을 사용하고 휴식하다, 예. 다음과 같이 입력하십시오 :

parse :: String -> Maybe Pos 
parse [] = Nothing 
parse (c:rest) = do 
    (r, _) <- listToMaybe $ reads rest 
    return (c, r) 
0

do 표기법을 사용해야합니까? 그렇지 않은 경우 다음 기능이 사용자의 요구에 맞습니다. 그것은 꽤 아니지만 그것은 일을 끝낼 수 있습니다.

parse :: String -> Maybe Pos 
parse (x:xs) = Just (x,read xs::Int) 

은 당신이 일반적으로 show의 반대이며, 둘 다 일반적으로 주어진 값을 표현하기 위해 하스켈 구문을 사용하여 "실패"고려하고 Nothing

+0

내 뜻을 명확히하는 질문의 편집을 참조하십시오. 또한 "read xs :: Int"는 예외를 생성하는 위의 대답에서 실패 할 수 있습니다. 그 경우에는 Nothing을 얻고 싶습니다. – donatello

관련 문제