Claus Reinke wrote:
My own awkward-looking translations were driven by having
found two tool's in Haskell that come close to this ideal, even
if the syntax is awkward: the mapping of pattern-match failure
to "fail" in do-notation, and the use of "fail msg=mzero" in
MonadPlus. By these means, matchings (lambdas with patterns
and explicit match failure) can be represented as do-blocks:
lhs->rhs ==> \x->do { lhs <- return x; return rhs } (1)
and then be composed (the examples I gave moved the \s to the front
instead and used "mplus" to compose matchings, but we could also lift
the compositions to function-level instead), and finally "spliced"
back (turning explicit into implicit match failure) using fromJust or
suchlike. Adding pattern guards into this translation was
straightforward - they simply go between the two returns.
Note that it is very much this issue of 'monadic choice' in the case of
pattern-match failure which is dealt with (in gory, assembly-level
categoretical terms) in the MPC2006 paper you can find at
http://www.cas.mcmaster.ca/~kahl/PMC/ (disclaimer: I am a co-author of
that particular paper).
An early draft of this paper relied heavily on `mplus` with an extra
condition -- until it was realized that very few monads satisfy this!
This is where 'function lifting' came in, where we essentially add
enough arrows "on the left" (in a completely deterministic and typed
manner, see the boxed-; and boxed-+ definitions) to pull failure up to
the right type, so that failure could be dealt with at the 'right
time'. It is only function types that introduce complications -- all
other types are quite straightforward to deal with.
[Deleted: Claus' derivation of a monadic lifting of pattern-match
failure which sure looks equivalent/ very close to what was in our
MPC2006 paper].
hey, that's great! so the lifting we are looking for is simply
lift match = (>>= (return . match)) . return
right? wrong, unfortunately. Looking more closely at the
translation of do-notation in 3.14 of the Report, we see
that it actually creates a new function by syntactic rather
than semantic manipulation (in fact mapping the problem
of fall-through back to a multi-equation first, then to "fail"), so we
have no hope of reproducing the nice behaviour wrt pattern-match
failure without using the do-notation, and all the syntax noise that
implies.
The MPC2006 paper has a section describing *which* monad that Haskell98
"bakes in" to its syntactic-level translation. So we agree with your
observation that there is a whole 'design space' of what to do on match
failure, but Haskell 98 bakes a particular choice in. See that section
for how other published papers "bake in" other choices, and how large
the design space can really be [for example, using the List monad leads
to quite interesting ideas, as does using LogicT].
I'm not sure whether Wolfram suggested only a simplication
of the specification of pattern matching or an actual reification
of the concepts of matching, composition of matching, and
splicing of matchings into multi-alternative lambdas.
Wolfram's PMC [1] is an all-out reification of the concepts of matching,
composition, splicing, etc. The biggest thing it doesn't handle are
some of Barry Jay's excellent ideas on generic pattern-matching (see
http://www-staff.it.uts.edu.au/~cbj/patterns/). The issue, as far as I
see it, is that although Barry's latest ideas are first-rate, they seem
extremely difficult to 'type' [and getting PMC to 'type' was really
non-trivial].
And one of the things that would make possible is to replace some
previously built-in and non-composable notions, like pattern-match
fall through and composition of rule alternatives, by a smaller, yet
more expressive core. And that is always a worthwhile goal for
language redesign, isn't it?-)
Agreed!
Jacques
[1] Proper attribution: the PMC is Wolfram's, I just thought it was so
cool that I insisted on 'helping' him with the type system...
_______________________________________________
Haskell-prime mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-prime