I think we should generalize the hyper stuff a little bit more.  I
want hyper operators serve as "fmap", or "functor map", rather than
just list.  This is a popular concept, and a pretty obvious
generalization.

A functor is any object $x on which you can do "fmap" such that it
satisfies these laws:

    $x.fmap:{$_} eqv $x               # identity maps to identity

    $x.fmap:{ f($_) }.fmap:{ g($_) } eqv
    $x.fmap:{ g(f($_)) }              # transparent to composition

Another way to think of a functor is just some sort of aggregate data
structure, where "fmap" is what you use to do something to each of its
elements.

In order to do this, I want to desymmetricalize hyper operators again.
 That is, you put the arrows on the side of the operator you have the
list (now functor).  This is so that if you have a functor on either
side of a hyper operator, it knows which side to map.

Here's how it works:

    $x >>+ $y         #  $x.fmap:{ $_ + $y }
    $x +<< $y         #  $y.fmap:{ $x + $_ }
    +<< $x            #  $x.fmap:{ +$_ }
    foo(1, >>$x<<, 2) #  $x.fmap:{ foo(1, $_, 2) }

etc.

For the current hyper semantics where (1,2,3) >>+<< (4,5,6) eqv
(5,7,9), there is also a "binary functor".  I call the mapping
function fmap2 (but maybe we can find a better name).

    fmap2($a, $b, { $^x + $^y })

It takes a two argument function and two functors and returns the
appropriate combination.  Not all functors have to be binary functors
(it's not clear that binary functors have to be regular functors
either).

    $x >>+<< $y       # fmap2($x, $y, &infix:<+>)

Luke

Reply via email to