On 9/8/05, Damian Conway <[EMAIL PROTECTED]> wrote:
> Luke wrote:
> 
>  > Okay, fair enough.  The reason that I thought it was surprising is
>  > because 1 and 2 are usually orthogonal patterns.
> 
> It depends what they're doing. Matched against a regex like /[12]/ they're
> not orthogonal either.

Well, then they're not patterns; they're the things being matched
against a pattern.  But then you could think of junctions in the same
way.  In fact, the proposal was to do precisely that.  But I think
you've knocked me off of that one (with your "multiple junctions in
the same expression" examples).

>  > that was a logical statement explaining that junctions are not logical.
> 
> Riiiiiiiiight. So "Luke's statement is a logical travesty" isn't an
> unsubstantiated emotive assertion either? ;-)

Hey. I backed up my claim with a proof!  Let's settle on "It doesn't
matter!" :-)

>  >>     if ! defined one(@inputs) {...}
>  >
>  > I don't get how this could possibly be useful.
> 
> That doesn't mean it's not. ;-)

You don't need to sell me on these, by the way.  You already did. 
That was just a comment on this particular example.

>  > So my original point was that, as cool as junctions are, they must not
>  > be values, lest logical assumptions that code makes be violated.  I
>  > can tell you one thing: an ordered set class assumes that < is
>  > transitive.  You had better not make an ordered set of junctions!
> 
> You can rest assured that I won't try to make one. Because it doesn't
> makes *sense* to even talk about an ordered set of junctions. Any more
> than it makes sense to talk about an ordered set of vectors, or lists,
> or regexes. Will you also be recommending that lists and regexes not be
> values???

Well, none of those things define a < operator.  I suppose one could
say that lists do, but he'd be wrong.  They coerce to numbers, which
in turn have a < operator, so you'd end up with a set of numbers...

I think I see where you're coming from though.  If we go with
Haskell's type classes, then I could see how this would work. 
Junction simply wouldn't do Eq or Ord (equality or ordering), since it
doesn't meet the prerequisites for doing those type classes
(transitivity and antisymmetry).  Then the Junctive > would be about
as similar to numeric > as IO::All's > is, at least from Perl's
perspective.

> More seriously, since the ordered set's methods presumably *won't* use
> (Item(+)Junction) type arguments, why will this be a problem? The
> ordered set will never *see* junctions.

Set of Junction?  If the methods are declared with parameters ::T (the
parameterization type of Set), then it certainly would accept
junctions.

Admittedly, that should just fail since it doesn't make any sense. 
Admittedly, it would probably end up succeeding and giving you an
infinite loop, and then comp.lang.perl.misc or #perl would give you a
belated compile-time error.  Or Set could say "No junctions!", but
then we're getting into special cases.

Hmm, incidentally, if we have:

    theory Value[::T] {
        # in order to do Value, eqv must be transitive:
        # $a eqv $b and $b eqv $c implies $a eqv $c
        multi infix:<eqv> (::T, ::T --> Bool) {...}
        # ... some useful methods
    }

(For those of you following along at home, don't worry if you don't
know what a "theory" is, I haven't proposed it yet.  For those of you
lambdacamels following along at home, a "theory" is basically a type
class.)

Then Junction shouldn't do Value, since it doesn't meet one of the
implicit requirements.  Since Sets only operate on Values (no
reference types allowed: they can change under your feet), then a Set
would reject a Junction as a valid parameterization.  Oh, I guess
Junction's absence of the Ordered class already did that.

Alright, this seems to be working out mathematically if we get type
classes.  It's really not a solution I like much, as it's basically
saying "yeah, junctions exist, but they really don't participate in
the algebra of your program".  Actually, since they don't do Value,
you can't make any aggregate of Junctions whether you declare it or
not (sub parameters are still okay when declared though; they don't
have to be Values).

Okay, with that, my position changes.  I no longer see anything wrong
with Junctions from a pure perspective.  I still think it's wrong to
Humans to have something that looks ordered but in fact isn't, and I
still think that if Junctions are values, you ought to be able to
metaprogram with them.  But I don't really have any ideas other than
the ones I've proposed in this thread and the one involving Haskell's
"M" word.

Luke

Reply via email to