Re: [Factor-talk] Quotations and generics

2014-12-05 Thread John Benediktsson
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

2014-12-05 Thread John Benediktsson
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

2014-12-05 Thread Andrea Ferretti
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

2014-12-05 Thread John Benediktsson
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

2014-12-05 Thread Andrea Ferretti
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