Hi Albert,

thanks for your answer. It helped in some other issues I have.
I did experiment with parenthesis, but obviously not in the right place.


I found the filterA arrow to do the thing I want, like this:

getRowWithHeading caption =
        filterA (deep (hasName "th" /> hasText (==caption) )) />
        hasName "td" >>>
        getChildren


I like to ask you if you might know the answer to the following:

In a structure
   +---XTag "a"
   |   +---XText "A text 1"
   |
   +---XText "Plain text 1"
   |
   +---XTag "a"
   |   +---XText "A text 2"
   |
   +---XText "Plain text 2"
   ...

I must combine "A text 1" with "Plain text 1", etc., but they are in sequence on the same level.

Is it possible, in a simple way, to do it in a single arrow flow?
(Or only outside the arrow by pairing the list items?)

Something like:
  hasName "a" /> getText  &&& (getNextItem??? >>> getText)


I assume not, but I'm still new to Haskell and would like to check.


br,

vlatko

-------- Original Message  --------
Subject: Re: [Haskell-cafe] Problem with HXT `when`
From: Albert Y. C. Lai <tre...@vex.net>
To: haskell-cafe@haskell.org
Date: 25.09.2013 03:22

On 13-09-21 05:13 AM, Vlatko Basic wrote:
I'd like to extract A texts from row with header "Caption", and have
come up with this

runX $ doc
     >>> (deep (hasName "tr")                                       --
filter only TRs
                >>> withTraceLevel 5 traceTree                   --
shows correct TR
                `when`
              deep (
                 hasName "th" >>>
-- filter THs with specified text
                 getChildren >>> hasText (=="Caption")
              ) -- inner deep
              >>> getChildren >>> hasName "td" -- shouldn't here be only
one TR?
              >>> getChildren
           )
          >>> getName &&& (getChildren >>> getText)  -- list has TDs
from all three TRs

Operator precedences:
   >>> infixr 1
   `when` infixl 9 (default)

Therefore, this expression redundantly parenthesized and systematically indented
to ensure that you are on the same page with the computer is:

runX $
     doc
     >>>
     ( deep (hasName "tr")
       >>>
-- begin{conditionally prints but otherwise is arr id}
       ( withTraceLevel 5 traceTree
         `when`
         deep ( hasName "th"
                >>>
                getChildren
                >>>
                hasText (=="Caption")
              ) -- inner deep
       )
-- end{conditionally prints but otherwise is arr id}
       >>>
       getChildren
       >>>
       hasName "td"
       >>>
       getChildren
     )
     >>>
     ( getName &&& (getChildren >>> getText) )

The condition on <th>Caption</th> ends up controlling trace messages only; it is
not used to limit real processing.

"when" doesn't help even when used correctly: it doesn't ban data. "guards" and
"containing" ban data, but you have to put them at the right place, i.e.,
parenthesize correctly.

runX $
     doc
     >>>
     ( deep ( hasName "tr"
              `containing`
              deep ( hasName "th"
                     >>>
                     getChildren
                     >>>
                     hasText (=="Caption")
                   )
            )
       >>>
       getChildren
       >>>
       hasName "td"
       >>>
       getChildren
     )
     >>>
     ( getName
       &&&
       (getChildren >>> getText)
     )

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to