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

Reply via email to