2014-04-13 2 views
3

간단한 HTML 페이지를 구문 분석 할 때 haskell 화살표를 배우고 있습니다.하스켈 화살표 : 목록에 값을 입력하십시오.

regions :: ArrowXml cat => cat a (NTree XNode) -> cat a Region 
regions tree = 
    tree >>> multi (hasName "a" >>> hasAttrValue "class" (== ".regionlink")) >>> 
    proc x -> do 
     rname <- getText <<< getChildren -< x 
     rurl <- getAttrValue "href" -< x 
     returnA -< Region rname rurl 

를하고 그 결과에베이스 영역을 추가합니다 :

allRegions :: ArrowXml cat => cat a (NTree XNode) -> cat a Region 
  1. 어떻게 쓸 작업은,베이스 영역 baseRegion = Region "Yekaterinburg" "http://example.com/r/ekb"의 사이트를 다운로드 (HXT를 통해) 다른 지역에 대한 링크를 구문 분석하는 것입니다 allRegions? 또는, 더 나은, 어디에 그것을 쓰려고 발굴해야합니까?
  2. 또 다른 질문은 regions의 결과를 추가하는 것이 아니라 baseRegion을 지역 목록의 특정 위치에 삽입하는 것입니다 (예를 들어 두 번째 요소 뒤에 또는 'E'로 시작하는 요소의 뒤에)?
+0

'baseRegion'에서 시작하여'regions (getXMLFromRegion region)'이 연속적으로 호출됩니다. 결과를 평면 목록에 계속 추가 할 수 있습니까? – iamnat

답변

2

나는 당신이 찾고있는 연결자가 타입 클래스의 (>>.)이라고 생각합니다. 화살표를 사용하여 목록 기능을 적용 할 수 있습니다. 예 : 화살표의 앞쪽에 요소를 붙이면됩니다.

regions tree >>. (baseRegion:) 

두 번째 질문의 경우 올바른 위치에 목록의 영역을 삽입하는 유틸리티 함수를 작성할 수 있습니다. (가) 위가되도록 다음

insertRegion :: Region -> [Region] -> [Region] 

과 같은 서명 뭔가 당신은 명시 적으로 화살표 체인을 사용 Btw는

regions tree >>. insertRegion baseRegion 

나는 개인적으로 regions 함수에서 트리 매개 변수를 제거 할 화살표를 사용할 수 있습니다 .

tree >>> regions >>. insertRegion baseRegion 
관련 문제