Question: i want get number between tags that not hex or unicode in a html content
like this with regular expression

```
<a href="/sam2/example-3.php">go to page 13</a> 0x91 0x26 exchange hello98.25 &#8230;

```

return

13 and 98.25

Answer: 
GHC may evaluate it far fewer than 9 times. In fact it does so, and we can prove that using `Debug.Trace.trace`

```
module Main (main) where 
import Debug.Trace

x = let strings = ["foo", "bar", "baz"]
    in  [filter (== char) (trace "\nconcat strings\n" (concat strings)) | char <- "oaxyz"]

main = do
    print x

```

Here is evaluates for "oaxyz" 5 times for -O0, and once for -O1 and -O2:

```
! 529)-> touch LC.hs ; ghc -O0 -o lc0 LC.hs 
[1 of 1] Compiling Main             ( LC.hs, LC.o )
Linking lc0 ...

(! 530)-> touch LC.hs ; ghc -O1 -o lc1 LC.hs 
[1 of 1] Compiling Main             ( LC.hs, LC.o )
Linking lc1 ...

(! 531)-> ./lc0; ./lc1; ./lc2

concat strings

concat strings

concat strings

concat strings

concat strings

["oo","aa","","","z"]

concat strings

["oo","aa","","","z"]

concat strings

["oo","aa","","","z"]

```
It will be evaluated twice. GHC doesn't [memoize](https://stackoverflow.com/questions/3951012/when-is-memoization-automatic-in-ghc-haskell). list comprehensions desugar like this

```
 [term | x <- xs, y <- ys ...] -- I ignore guards

 do
  x <- xs
  y <- ys
  ...
  return term

```

Which is the same as

```
 flip concatMap xs $ \x -> flip concatMap ys $ \y -> ... [term]

```

So it's clear that `term` is going to be computed `l1 * l2 * l3 ... ln` times where `li` is the length of the `i`th list.