2012-09-22 3 views
1

나는 이것에 대한 간단한 대답이 확실하다고 확신하지만, 나는 하루 종일 이것을보고 있었고 나는 그것을 알 수 없다.FParsec 연결자가 파서 까지 파서를 <char,_>으로 바꿉니 까?

튜토리얼에 따라 JSON 파서를 구현하고 있습니다. 자신에게 도전하기 위해 나는 number 파서를 직접 구현하고있다.

이것은 내가 지금까지 무엇을 가지고 있습니다 :

let jnumber = 
    let neg = stringReturn "-" -1 <|> preturn 1 
    let digit = satisfy (isDigit) 
    let digit19 = satisfy (fun c -> isDigit c && c <> '0') 
    let digits = many1 digit 
    let ``int`` = 
     digit 
     <|> (many1Satisfy2 (fun c -> isDigit c && c <> '0') isDigit) 

문제는 int에 대한 두 번째 옵션은 Parser<string,_> 반면 digit가하는 Parser<char,_> 것입니다. 일반적으로 digitParser<char,_>으로 바꾸기 위해 연결자를 사용합니까, 아니면 내가해야 할 일이 있습니까?

답변

3

연산자는 |>>입니다. 나는 the FParsec reference을 인용 :

val (|>>): Parser<'a,'u> -> ('a -> 'b) -> Parser<'b,'u> 

파서 P 는 | >> f는 파서 피를 적용하고, x는 P에 의해 반환 된 결과 인 기능 응용 프로그램 f를 X의 결과를 반환합니다.

p | >> f는 012 >>> fun x -> preturn (f x)의 최적화 된 구현입니다. 예를 들어

: 당신은 매우 집중적으로이 연산자를 사용 FParsec tutorial on parsing JSON을 읽을 수 있습니다

let jnumber = 
    let neg = stringReturn "-" -1 <|> preturn 1 
    let digit = satisfy (isDigit) 
    let digit19 = satisfy (fun c -> isDigit c && c <> '0') 
    let digits = many1 digit 
    (digit |>> string) (* The operator is used here *) 
    <|> (many1Satisfy2 (fun c -> isDigit c && c <> '0') isDigit) 

.

+0

허, 나는 그것을 시도했다고 생각합니다. 고마워요. –

+0

그리고 그래, 그게 내가 지금하고있는 일이야. –