[Haskell] Re: Context of a pattern variable

Tomasz Zielonka tomasz.zielonka at gmail.com
Wed Jan 12 04:49:54 EST 2005


On Tue, Jan 11, 2005 at 10:12:06PM -0500, kahl at cas.mcmaster.ca wrote:
> Tomasz Zielonka <tomasz.zielonka at gmail.com>
> proposed an interesting kind of ``second-order as-patterns''
> that are ``safe'' from the usual problems of second-order matching
> by virtue of fixing (at least) the spine
> of the images of the second-order variables.

So it is a known idea?

> This could be alleviated by making the character of the intended binding
> as a second-order binding more explicit
> by allowing as-patterns to bind against function left-hand sides,
> where variables occurring in patterns may be ``co-bound''
> in the pattern part of the as-pattern
> by a SINGLE occurrence of the ``co-as''
> for which I continue to use Tomasz' symbol ``@>''.
> 
> The first example would then be written:
> 
>    case t of
>       (ctx zH) @ (_, _, zH @> z) -> ctx (z + 1)

Probably I get something wrong, but couldn't we simply write it this way?

  case t of
      (ctx z) @ (_, _, z) -> ctx (z + 1)

That is - completely forget about @> ?

Anyway, I like your notation very much. Mine was a bit clumsy.

> The first occurrence of zH is a binding occurrence,
> and the second occurrence is co-bound by the ``@>''.
> (Replacing ``@>'' with ``@'' could give rise to confusing errors,
>  no matter which way the binding of its left argument is resolved.)

Could you give an example?

> The first version of Tomasz' counterexample
> is treated in the same way as the first example:
> 
>   case t of
>     (ctx zH) @ (x, y, (a, zH @> Just z)) -> ctx z
> 
> The expression corresponding to the ``broken'' context
> then exhibits a composed context:
> 
>   case t of
>     (ctx1 vH) @ (x, y, vH @> v) ->
>         case v of
>            (ctx2 zH) @ (a, zH @> Just z) -> ctx1 (ctx2 z)

Nice. So we could also collapse the case expressions, nesting the
second-order patterns?:

  case t of
    (ctx1 vH) @ (x, y, vH @> (ctx2 zH) @ (a, zH @> Just z)) -> ctx1 (ctx2 z)

> I think that this way we have the concepts right ---
> how useful this feature would be
> is probably going to be mostly a question of programming style.
> For very deep pattern matching in, for example, XSLT-like applications
> it could probably be quite convenient.

I wonder if this idea could be nicely combined with HaRP - Haskell Regular
Patterns...

Thanks for your insightful and enlightening comment!

Best regards,
Tomasz


More information about the Haskell mailing list