[Haskell-cafe] Problem with HXT `when`
Albert Y. C. Lai
trebla at vex.net
Wed Sep 25 03:22:42 CEST 2013
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)
)
More information about the Haskell-Cafe
mailing list