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 <trebla@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