Those solutions don't check to make sure both quotations have the same
effect, or at least the same number of effect inputs, you might want to add
some of that for production-type code :-)

On Fri, Dec 5, 2014 at 7:37 AM, Andrea Ferretti <ferrettiand...@gmail.com>
wrote:

> Wow, you and Factor never stop to surprise me! :-)
>
> 2014-12-05 16:23 GMT+01:00 John Benediktsson <mrj...@gmail.com>:
> > And more generally, using the ``generalizations`` vocabulary:
> >
> > M: quotation |+|
> >     dup infer in>> length [ nbi |+| ] 3curry ;
> >
> > On Fri, Dec 5, 2014 at 7:22 AM, John Benediktsson <mrj...@gmail.com>
> wrote:
> >>
> >> You could use the stack-checker to infer the effect of the quotation and
> >> then dispatch like this:
> >>
> >> ```
> >> M: quotation |+|
> >>     dup infer in>> length {
> >>         { 1 [ [ bi |+| ] 2curry ] }
> >>         { 2 [ [ 2bi |+| ] 2curry ] }
> >>         { 3 [ [ 3bi |+| ] 2curry ] }
> >>     } case ;
> >> ```
> >>
> >> But you might start running into places where the compiler is trying to
> >> dispatch on the run-time value of a quotation, and you would need to
> add a
> >> ``call( x y -- z )`` with static stack effects to tell it what to
> expect.
> >>
> >> We have multiple dispatch implemented in the ``multi-methods``
> vocabulary,
> >> so you could do something like this:
> >>
> >>     http://re-factor.blogspot.com/2013/10/rock-paper-scissors.html
> >>
> >>
> >>
> >> On Fri, Dec 5, 2014 at 2:10 AM, Andrea Ferretti <
> ferrettiand...@gmail.com>
> >> wrote:
> >>>
> >>> Hi, I am trying to implement monoids in factor. A monoid is a set with
> >>> a binary associative operation (and, depending on the defintiion, a
> >>> neutral element for it).
> >>>
> >>> Typical examples are numbers (with either addition or multiplication)
> >>> or sequences (with concatenation). Other examples can be derived from
> >>> these, since hastables whose values are in a monoid are also naturally
> >>> a monoid.
> >>>
> >>> My implementation is here
> >>>
> >>>
> >>>
> https://github.com/andreaferretti/factor-work/blob/master/monoid/monoid.factor
> >>>
> >>> Using |+| as the word for the operation, one has for instance
> >>>
> >>> 3 5 |+|
> >>> ! gives 8
> >>>
> >>> "hello " "world" |+|
> >>> ! gives "hello world"
> >>>
> >>> H{ { 1 2 } { 3 4 } } H{ { 1 5 } { 5 6 } } |+|
> >>> ! gives H{ { 1 7 } { 3 4 } { 5 6 } }
> >>>
> >>>
> >>> The issue I have is with quotations. Functions with values in a monoid
> >>> are also naturally a monoid - in order to sum two functions, apply
> >>> both and sum the values.
> >>>
> >>> So I have the definition
> >>>
> >>> M: quotation |+| [ bi |+| ] 2curry ;
> >>>
> >>> The problem is that this only works for functions of one argument. For
> >>> functions of 2 arguments one would have to use
> >>>
> >>> M: quotation |+| [ 2bi |+| ] 2curry ;
> >>>
> >>> and so on.
> >>>
> >>> Unfortunately, there is only a class quotation, which does not seem to
> >>> distinguish the arity.
> >>>
> >>> For comparison, in scala functions have different types based on the
> >>> arity (such a Function2[A1, A2, B]), and this allows to correctly
> >>> define |+| - in fact it is a common method in scalaz.
> >>>
> >>> Is there anything I can do to make this work regardless of function
> >>> arity? Also, what about dispatching on both arguments, so that the
> >>> method only makes sense for a pair of numbers or a pair of quotations,
> >>> but, say
> >>>
> >>> 3 "hi" |+|
> >>>
> >>> fails to dispatch?
> >>>
> >>>
> >>>
> ------------------------------------------------------------------------------
> >>> Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
> >>> from Actuate! Instantly Supercharge Your Business Reports and
> Dashboards
> >>> with Interactivity, Sharing, Native Excel Exports, App Integration &
> more
> >>> Get technology previously reserved for billion-dollar corporations,
> FREE
> >>>
> >>>
> http://pubads.g.doubleclick.net/gampad/clk?id=164703151&iu=/4140/ostg.clktrk
> >>> _______________________________________________
> >>> Factor-talk mailing list
> >>> Factor-talk@lists.sourceforge.net
> >>> https://lists.sourceforge.net/lists/listinfo/factor-talk
> >>
> >>
> >
> >
> >
> ------------------------------------------------------------------------------
> > Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
> > from Actuate! Instantly Supercharge Your Business Reports and Dashboards
> > with Interactivity, Sharing, Native Excel Exports, App Integration & more
> > Get technology previously reserved for billion-dollar corporations, FREE
> >
> http://pubads.g.doubleclick.net/gampad/clk?id=164703151&iu=/4140/ostg.clktrk
> > _______________________________________________
> > Factor-talk mailing list
> > Factor-talk@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/factor-talk
> >
>
>
> ------------------------------------------------------------------------------
> Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
> from Actuate! Instantly Supercharge Your Business Reports and Dashboards
> with Interactivity, Sharing, Native Excel Exports, App Integration & more
> Get technology previously reserved for billion-dollar corporations, FREE
>
> http://pubads.g.doubleclick.net/gampad/clk?id=164703151&iu=/4140/ostg.clktrk
> _______________________________________________
> Factor-talk mailing list
> Factor-talk@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/factor-talk
>
------------------------------------------------------------------------------
Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
from Actuate! Instantly Supercharge Your Business Reports and Dashboards
with Interactivity, Sharing, Native Excel Exports, App Integration & more
Get technology previously reserved for billion-dollar corporations, FREE
http://pubads.g.doubleclick.net/gampad/clk?id=164703151&iu=/4140/ostg.clktrk
_______________________________________________
Factor-talk mailing list
Factor-talk@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/factor-talk

Reply via email to