2010-04-01 2 views
1

내 모듈에서 데이터 형식 중 하나에 대한 사용자 지정 읽기 함수를 쓰고 있습니다. 예를 들어 read "(1 + 1)" :: Data을 입력하면 Plus 1 1을 반환하고 싶습니다. 내 데이터 신고는 data Data = Plus Int Int입니다. 감사합니다.사용자 지정 읽기 함수의 패턴 일치

+0

여기에 어떤 질문이 있는지 잘 모르겠습니다. 귀하의 주제는 패턴 일치를 언급하지만 질문의 본문은 그렇지 않습니다. 당신은 커스텀 읽기 기능을 쓰고 있다고 말했지만, 당신은 어떤 문제가 발생했는지 말하지 않습니다. – sepp2k

+0

문제는 문자열과 일치하는 일부 패턴을 수행하려고합니다. 예 : 문자열이 "(1 + 1)"이면 플러스 1을 반환합니다. "(2 - 1)"이면 마이너스 2 1을 반환합니다. 연산자는 + - */일 수 있습니다. 피연산자는 정수가 될 수 있습니다. 그러나 연산자는 공백으로 묶어야하며 전체 표현식에 괄호가 있어야합니다. – altair211

답변

2

GHC의 ReadP을 사용할 수 있습니다.

6

이것은 파서에 더 잘 맞는 것으로 들립니다. Parsec은 강력 하스켈 파서 결합 자 라이브러리입니다.

3

나는 파서를 사용하는 개념을 2 등하고 싶습니다. 그러나 패턴 일치를 절대적으로 사용해야하는 경우 다음과 같이하십시오.

import Data.List 

data Expr = Plus Int Int | Minus Int Int deriving Show 

test = [ myRead "(1 + 1)", myRead "(2-1)" ] 

myRead = match . lexer 
    where 
    match ["(",a,"+",b,")"] = Plus (read a) (read b) 
    match ["(",a,"-",b,")"] = Minus (read a) (read b) 
    match garbage   = error $ "Cannot parse " ++ show garbage 

lexer = unfoldr next_lexeme 
    where 
    next_lexeme "" = Nothing 
    next_lexeme str = Just $ head $ lex str