Re: [Factor-talk] Quotations and generics
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=164703151iu=/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=164703151iu=/4140/ostg.clktrk___ Factor-talk mailing list Factor-talk@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/factor-talk
Re: [Factor-talk] Quotations and generics
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=164703151iu=/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=164703151iu=/4140/ostg.clktrk___ Factor-talk mailing list Factor-talk@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/factor-talk
Re: [Factor-talk] Quotations and generics
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=164703151iu=/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=164703151iu=/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=164703151iu=/4140/ostg.clktrk ___ Factor-talk mailing list Factor-talk@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/factor-talk
Re: [Factor-talk] Quotations and generics
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=164703151iu=/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=164703151iu=/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=164703151iu=/4140/ostg.clktrk ___ Factor-talk mailing list Factor-talk@lists.sourceforge.net
Re: [Factor-talk] Quotations and generics
Ehr... in fact, I was not :-P In fact, the implementation of |+| that comes from this is composition, which is of course another natural operation. I did not hitnk of it 2014-12-05 18:55 GMT+01:00 Björn Lindqvist bjou...@gmail.com: I wonder, are you aware that quotations are just a type of sequence? So: [ * ] [ numberstring print ] append [ 3 9 ] dip call Does what you would expect. :) You can even add stack effects and the algebra will work out: ( x -- ) ( x x x -- x x ) compose-effects 2014-12-05 11:10 GMT+01:00 Andrea Ferretti ferrettiand...@gmail.com: 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 -- mvh/best regards Björn Lindqvist -- 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=164703151iu=/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=164703151iu=/4140/ostg.clktrk ___ Factor-talk mailing list Factor-talk@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/factor-talk