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