2012-09-29 2 views
3

페이지에서 우리는 함수 item을 파서로 정의합니다. 함수는 String이고 실패하면 [(Char, String)] 또는 []을 반환합니다. 78 페이지에하스켈에서 프로그래밍의 함수 파서 예제

우리는 함수 술어 p와 "랩"나는 <-의 마법 이해하지 않는 무슨

p :: (Char -> Bool) -> Parser Char 
sat p = do x <- item 
      if p x then return x else failure 

주위를 파서 건설 소요 sat을 정의? item의 결과가 비어 있지 않으면이 연산자는 목록을 언랩하고 튜플에서 첫 번째 항목을 가져와야합니다. 그렇지 않으면 술어를 질식시키지 않는 무언가가 생성됩니다. 내가 뭘 놓치고 있니?

item >>= (\x -> if p x then return x else failure) 

>>= 모나드는 결합 연산자이기

+0

당신이 Graham Hutton의 "Programming in Haskell"을 사용하고있는 것처럼 보입니다. Graham은이 장에서 간단하게 Haskell이 아닌 간략화를 사용합니다.이 장의 마지막 부분 (8.9 절)과 Graham의 웹 페이지에서 직접 실행 가능한 Haskell에 대한 온라인 코드를 참조하십시오. –

답변

3
do x <- item 
    if p x then return x else failure 

이는 문법적이다.

무엇이 누락되었습니다 : Parser 유형의 경우 >>=의 정의는 무엇입니까? (어디 책에서 정의 Parser에 대한 Monad 인스턴스? 그것은 instance Monad Parser where를 시작합니다.)

1

do 표기법은 모나드 연산자 (>>=)의 응용 프로그램에 desugared된다. 보다 정확하게, sat의 정의는 다음 정의와 일치합니다.

sat p :: (Char -> Bool) -> Parser Char 
sat p = 
    item >>= \x -> if p x then return x else failure 

오퍼레이터 (>>=) 제 입력에 item 파서를 적용한다. 이 구문 분석기를 올바르게 관찰하면 첫 번째 문자가 생성됩니다. 그런 다음 (>>=)은 첫 번째 파서의 결과를 두 번째 인수, 즉 \x -> if p x then return x else failure 함수에 전달합니다. 이 함수는 입력 스트림의 첫 문자에 대해 조건부가 충족되는지 여부를 확인합니다. 만족하면 함수는 아무런 입력도 사용하지 않고 단순히 결과로 x을 산출하는 파서 (return x)를 산출합니다. 술어를 만족하지 않으면 함수는 입력에 실패한 구문 분석기 (failure)를 생성합니다.

관련 문제