2011-12-11 2 views
5

하스켈에서 Arrows에 대해 배우려고합니다. 따라서 XML 용 화살표 기반 HXT 라이브러리로 간단한 애플리케이션을 작성하고 있습니다. HXT 위키 및 자습서의 예는 기능 유형 서명을 보류합니다. 그러나, 나는 타입을 아주 좋아하고 그것을 사용하는 방법을 찾으려고 노력하고있다. 이것은 내가 걸림돌을 만난 곳입니다. 나는 그들이 다음과 같은 서명을 할당해야합니다 그림화살표/HXT 및 유형 서명

readXml str = runX (readString [withValidate no] str) 

atTag tag = deep (isElem >>> hasName tag) 

:이 기능을 감안할 때 나는 등이 함께 사용하여 화살표 구문 후크하려고

readXml ∷ String → IO [XmlTree] 

atTag ∷ ArrowXml a ⇒ String → a XmlTree XmlTree 

그러나

parseItem = proc str -> do 
    desc <- text <<< atTag "description" <<< arr readXml -< str 
    ... 

을, 내 타입 서명이 맞다면 (GHC는 불평하지 않았다), XmlTree을 꺼내고로 돌아 가기 위해 모나드 구문과 화살표 구문을 결합하는 방법이 필요하다..

진행 방법이 확실하지 않습니다. 누구나 통찰력이 있습니까? readXml의 정의에 사용 runX

답변

3

함수로 화살표 "변환"및 parseItem의 정의에 arr을 사용하여 다시 화살표로 해당 함수를 변환한다. 이제 이 IOStateArrow (IOSLA - IO 상태 목록 화살표에 대한 특수 유형 별칭)을 반환한다는 것을 제외하고는 이 좋을 것입니다. 이는 Arrow뿐만 아니라 IOArrow으로 처리해야합니다. 그 사이에 arr을 사용하여 다시 포장하여 순수 Arrow으로 취급하고 있습니다. readXml :: String -> IOStateArrow s b XmlTree 있도록

  1. readXml = readString [withValidate no]합니다

    현재 두 가지 옵션이 있습니다. 그런 다음 ... <<< readXml strparseItem에 입력하면됩니다.

  2. arrIO을 사용하여 readXml을 IO 화살표로 가져 와서 의도 한대로 사용할 수 있습니다.

이 경우 옵션 1을 사용합니다. 특수한 이유가 없으면이 화살표 포장지를 풀기가 불필요한 것처럼 보입니다.

+0

혼란 스럽습니다. 시나리오 1에서 readXml은 실제로 화살표가 아니라 화살표를 반환하는 함수입니다. 화살표 구문과 같이 이것을 어떻게 사용할 수 있습니까? – providence

+0

코드를 복사 할 때'- <'를 삭제하는 것을 잊어 버렸습니다. 지금은 분명해야합니다. – dflemstr