[Haskell-cafe] Problem with HXT `when`
Vlatko Basic
vlatko.basic at gmail.com
Wed Sep 25 15:36:59 CEST 2013
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 at vex.net>
To: haskell-cafe at 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 at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
More information about the Haskell-Cafe
mailing list